我有一个(对于C ++程序员比我更好)类和指针的简单问题。 我想过发布描述我的问题的示例代码,但我发现用文字解释它更容易。
假设我有三个班级:
B
和C
的实例。Greet()
。Greet()
类B
的实例中调用A
。我们将其命名为DoSomethingWithB()
所以程序启动,在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();
}
答案 0 :(得分: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)
),它不会让函数修改传入的对象(除非constness被抛弃 - 如果完成则会导致未定义的行为在一个对象上,这是真的const
)
作为指向const
对象(B
或void DoSomethingWithB( B* b)
)的指针或void DoSomethingWithB( B const* pb)
指针。它们具有与通过引用传递类似的性能,但该函数可以传递一个NULL指针,需要正确处理(在这种情况下不通过解除引用)。此外,函数的调用需要稍微改变以传递B
对象的地址:
c.DoSomethingWithB( &b);
作为值传递参数(void DoSomethingWithB( B b)
)。这有点不同,函数可以对传入的对象执行任何它喜欢的操作,并且它不会影响最初传递的对象,因为函数正在处理副本。缺点是传递参数导致复制可能是昂贵的。你也可以传递一个const
值,但没有什么值得推荐的,而不是传递const
引用。
请注意,在选择参数传递方法时,您应首先根据您需要该功能执行(或不执行)操作的语义进行选择。以后担心效率。始终首先设计并编写正确的代码 - 只有在设计和代码正确后才能担心效率。
答案 1 :(得分:3)
将功能更改为以下内容:
void DoSomethingWithB(B& b)
{
b.Greet();
}
......并在A ...
c.DoSomethingWithB(b);
答案 2 :(得分: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 );
}
};
我建议在这里使用参考方法而不是指针,因为:
答案 3 :(得分: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 );
}
答案 4 :(得分:0)
我无法从C内部访问B
不是在B中使用C调用方法,为什么不将C返回给调用者的信息,以便它可以执行操作?
当我点击这些时,我发现这是因为我的课程组织得不好。通常,如果我重新考虑它们,那么新的组织就会消失。
答案 5 :(得分:-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( );
}
};