2010-02-16 102 views
4

对于类和指针,我有一个(对于C++程序员比我更好)的简单问题。 我想过发表描述我的问题的示例代码,但我发现用单词解释它比较容易。C++指向类实例的指针

假设我有三个类:阿

  • 类别:主类 - 它包含两个BC的一个实例。
  • B类:该类包含一个输出字符串的方法,称之为Greet()
  • C类:这一个也有一个方法,但该方法必须在位于类AB的实例中调用Greet()。我们来命名它DoSomethingWithB()

所以程序启动时,在主函数中我创建了一个A的实例。 A再次创建BC的实例。然后,A呼叫C.DoSomethingWithB();

并且我的问题开始出现:我无法从C中访问B

很显然,我需要一个指针传递给BDoSomethingWithB()函数,这样我可以叫B.Greet()C

龙解释,简短的问题:我如何做到这一点?

示例代码来电:

#include <iostream> 
using namespace std; 

class B 
{ 
public: 
    void Greet() 
    { 
     cout<<"Hello Pointer!"<<endl; 
    } 
}; 

class C 
{ 
public: 
    void DoSomethingWithB() 
    { 
     // ... b.Greet(); Won't work obviously 
    } 
}; 

class A 
{ 
public: 
B b; // Not caring about visibility or bad class/variable names here 
C c; 
void StartTest() 
{ 
     c.DoSomethingWithB(); 
} 
}; 

int main() 
{ 
    A mainInstance; 
    mainInstance.StartTest(); 
} 

回答

8

难道你简单地传递一个指针或引用他B反对呢?

class C 
{ 
public: 
    void DoSomethingWithB(B& b) 
    { 
     b.Greet(); // will work fine 
    } 
}; 

class A 
{ 
public: 
B b; // Not caring about visibility or bad class/variable names here 
C c; 
void StartTest() 
{ 
     c.DoSomethingWithB(b); 
} 
}; 

如果DoSomethingWithB()功能将无法修改B实例过去了,你应该标记参考const因此它可以用const B对象调用(例如,如果拥有A对象恰好是const) :

void DoSomethingWithB(B const& b); 

您有怎样的B对象传递给函数的几个选项:

  • 作为参考(void DoSomethingWithB(B& b))它将让函数修改传入的对象。更改将在传入的对象中被重新引用。

  • const引用(void DoSomethingWithB(B const& b)),这不会让函数修改传入的对象(除非是常量性抛弃 - 的东西,如果对一个对象完成这可能会导致不确定的行为是忠实地const

  • 作为指针或const指向B对象(void DoSomethingWithB(B* b)void DoSomethingWithB(B const* pb))的指针。这些函数与传递引用类似,但函数可以传递一个需要正确处理的NULL指针(在这种情况下不要取消引用)。另外,函数的调用将需要稍微改变传递B对象的地址:

    c.DoSomethingWithB(&b); 
    
  • 作为通按值参数(void DoSomethingWithB(B b))。这有一个区别,即函数可以做任何喜欢的传入的对象,它不会影响最初传递的对象,因为函数正在处理副本。缺点是传递参数会导致复制,这可能是昂贵的。您也可以传递const值,但几乎没有建议通过const参考。

请注意,当选择参数传递方法时,您应该首先根据您需要的功能(或不做)的语法选择。后期担心效率。始终首先设计和编写正确的代码 - 只有在设计和代码正确之后才需要考虑效率。

+0

这就是我正在寻找的,还不太熟悉指针。这是最有效的方法吗? – lamas 2010-02-16 17:18:46

+2

我也在这里提到** const **引用,只是为了显示该选项。 – 2010-02-16 17:19:35

+0

我不确定我是否错过了一些东西,因为你的问题包含了一些关于课堂使用和可见性的知识;这似乎过于直接的答案。但每个人都需要从头开始学习;这只是这个问题似乎表明,可能还有更多。 – 2010-02-16 17:22:50

-1
class C 
{ 
public: 
    C (B & b) : b(b) {} 
    void DoSomethingWithB() 
    { 
     // ... b.Greet(); Use b; 
    } 
private: 
    B & b; 
}; 

class A 
{ 
public: 
B b; // Declare b before c! 
C c; 
A() : c (b) {} 
void StartTest() 
{ 
     c.DoSomethingWithB(); 
} 
}; 
2

你可以做到这一点,就像你说的 - 传递一个指针(或参考)在向B DoSomethingWithB()

class C 
{ 
public: 
    void DoSomethingWithB(B & bInstance) 
    { 
     bInstance.Greet(); // should work fine! 
    } 
}; 

然后你就调用它像这样:

class A 
{ 
public: 
    B b; // Not caring about visibility or bad class/variable names here 
    C c; 
    void StartTest() 
    { 
     c.DoSomethingWithB(b); 
    } 
}; 

我建议在这里使用参考方法而不是指针,因为:

  1. 您的对象是一个自动类成员,而
  2. 将null B对象传递给函数在这种情况下没有意义。
3

更改的功能为以下:

void DoSomethingWithB(B& b) 
{ 
    b.Greet(); 
} 

...和在甲...

c.DoSomethingWithB(b); 
0

在类C,声明这样的方法DoSomethingWithB():

void DoSomethingWithB(B* b) 
{ 
    b->Greet(); 
} 

而在A级调用它是这样的:

void StartTest() 
{ 
    c.DoSomethingWithB(&b); 
} 

既然你提到了指针,我回答了使用指针。但是,在C++中,您应该尽可能使用const引用。这当然需要一个小的变化,以现有的代码:

void DoSomethingWithB(const B& b) 
{ 
    b.Greet(); 
} 

// and 

void StartTest() 
{ 
    c.DoSomethingWithB(b); 
} 
0

我不能从C内

访问而不必在B C调用方法,为什么不能有Ç说明B将信息返回给调用者,以便它可以执行操作?

当我碰到这些时,我发现这是因为我的课程组织得不好。通常情况下,如果我重新考虑这个问题,新的组织会消失。