我有一个(对于比我更好的C++程序员)类和指针的简单问题.我想过发布描述我的问题的示例代码,但我发现用文字解释它更容易.
假设我有三个班:
B和C.Greet().Greet()中的实例.我们来命名吧BADoSomethingWithB()所以程序启动,在main函数中我创建了一个实例A.A再次,创建B和的实例C.然后,A打电话C.DoSomethingWithB();.
我的问题就出现了:我无法B从内部访问C.
很显然,我需要一个指针传递给B该DoSomethingWithB()函数,这样我可以调用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();
}
Run Code Online (Sandbox Code Playgroud)
难道你不是简单地将指针或引用传递给他的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);
}
};
Run Code Online (Sandbox Code Playgroud)
如果DoSomethingWithB()函数不会修改传入的B实例,则应该标记引用,const以便可以使用constB对象调用它(例如,如果拥有A对象恰好是const):
void DoSomethingWithB( B const& b);
Run Code Online (Sandbox Code Playgroud)
您有几个选项可以将B对象传递给函数:
作为reference(void DoSomethingWithB( B& b)),它将让函数修改传入的对象.将在传入的对象中重新进行更改.
作为constreference(void DoSomethingWithB( B const& b)),它不会让函数修改传入的对象(除非constness被抛弃 - 如果在对象上完成,可能会导致未定义的行为const)
作为指向对象(或)的指针或const指针.它们具有与通过引用传递类似的性能,但该函数可以传递一个NULL指针,需要正确处理(在这种情况下不通过解除引用).此外,函数的调用需要稍微改变以传递对象的地址:Bvoid DoSomethingWithB( B* b)void DoSomethingWithB( B const* pb)B
c.DoSomethingWithB( &b);
Run Code Online (Sandbox Code Playgroud)作为pass-by-value参数(void DoSomethingWithB( B b)).这有点不同,函数可以对传入的对象执行任何它喜欢的操作,并且它不会影响最初传递的对象,因为函数正在处理副本.缺点是传递参数导致复制可能是昂贵的.你也可以传入一个const值,但没有什么可以推荐传递一个const引用.
请注意,在选择参数传递方法时,您应该首先根据您需要该功能执行(或不执行)操作的语义进行选择.以后担心效率.始终首先设计并编写正确的代码 - 只有在设计和代码正确后才能担心效率.