我想知道是否有办法将一个类的对象放在标题中?
例如:
class MyClass {
} object;
如果我在那里制作了一个对象,然后在多个源文件中包含标题,我会发现找到多个定义符号的错误。我很新,所以不完全理解一切。
另外,我想在不同的函数中执行类似object.function()
的操作,这是另一个类的成员,我该怎么办?
答案 0 :(得分:4)
假设您想要一个对象,在头文件中只声明对象:
extern blabla object;
然后在一个源文件中定义它:
blabla object;
至于从不同的类调用对象的方法,只要该方法是公共的,这就完全没问题。
class foo
{
public:
void public_method();
private:
void private_method();
};
void some_other_class::method(foo &f)
{
f.public_method(); // this is fine
f.private_method(); // this is not okay, private_method can only be called from
// within foo
}
还有第三个可见性(受保护),一旦你开始处理继承就会发挥作用。
答案 1 :(得分:1)
您可以找到方法(参见其他答案),但不要这样做。正如您所说,您是C ++的新手,因此更好地学习良好实践,并在需要全局对象时 - 在源(cpp)文件中创建它们。
除此之外,尽量避免使用全局对象,并在类或函数中定义对象。
答案 2 :(得分:0)
将定义放在头文件中并不是一个好习惯,因为这会导致您遇到的错误。虽然有办法绕过这个(外部,头部防护),但应尽可能避免。请记住,在头文件中放置声明,在源文件中定义。
答案 3 :(得分:0)
关于你的第二个问题注释,你也可以使用::运算符和类名称(没有实例)调用静态方法:
void AnOtherClass::method()
{
TheFirstClass::static_method();
}
答案 4 :(得分:-1)
如果符合您的需要,您还可以使用singleton模式。
第二个问题。您始终可以将类对象作为要从中调用object.function()的类的(私有)成员变量。
例如:
// File a.h, includeguards etc. left out for clarity
class A {
public:
void func();
};
// File b.h
#include "a.h"
class B {
public:
void func();
private:
A object;
};
// File b.c
#include "b.h"
void B::func()
{
object.func();
}
希望有所帮助。