让我们有一个C ++对象A. A中有两个变量(VAR1和VAR2)可供子代访问。 对象B扩展A并具有一个私有变量VAR3,它还可以访问VAR1和VAR2。 A / B的每个实例都有自己的变量。
这是宣告和定义变量的正确方法吗?
A.H
class A {
protected:
static std::string const VAR1;
static std::string VAR2;
};
A.cpp
#include "A.h"
using namespace std;
string const A::VAR1 = "blah";
string A::VAR2;
B.h
#include "A.h"
class B : public A {
private:
static std::string VAR3;
public:
B(std::string const v1, std::string const v2);
void m() const;
};
B.cpp
#include "B.h"
using namespace std;
string B::VAR3;
B::B(string const v1, string const v2) {
VAR2 = v1;
VAR3 = v2;
}
void B::m() const {
// Print VAR1, VAR2 and VAR3.
}
答案 0 :(得分:4)
A / B的每个实例都有自己的变量。
这是宣告和定义变量的正确方法吗?
没有。您已将A
的成员声明为static
,这意味着它们是类变量,而不是实例变量。每个实例都没有得到它自己的副本。相反,它们都共享相同的实例。
然后制作非static
:
class A {
protected:
std::string const VAR1;
std::string VAR2;
};
...然后,当然,你不需要全局初始化程序,所以摆脱这个:
string const A::VAR1 = "blah";
string A::VAR2;
...如果您希望VAR1
每次A
实例化时都有默认值,那么您可以在类的初始化列表中(或者在ctor正文中,如果您“是朋克:)):
A::A() : VAR1("blah") {};
答案 1 :(得分:1)
A / B的每个实例都有自己的变量。
不是这样。你已经宣布了他们static
。停止这样做,你可能会更接近你想要的结果。
答案 2 :(得分:1)
不,你弄错了。
A
和B
的数据声明为static
?答案 3 :(得分:0)
class A{
protected:
char var1,var2;
};
class B: public A {
private:
char var3;
};
void main()
{
B b1;
b1.var3='a';
}