6

让我们有一个 C++ 对象 A。A 中有两个变量(VAR1 和 VAR2)可供其子级访问。对象 B 扩展 A 并具有一个私有变量 VAR3,它还可以访问 VAR1 和 VAR2。A/B 的每个实例都有自己的变量。

这是声明和定义变量的正确方法吗?


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;

溴化氢


#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.
}
4

4 回答 4

4

A/B 的每个实例都有自己的变量。

这是声明和定义变量的正确方法吗?

不,您已将A's 成员声明为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") {};
于 2011-01-31T18:32:04.547 回答
1

A/B 的每个实例都有自己的变量。

不是这样。你已经声明了它们static。停止这样做,您可能会更接近您想要的结果。

于 2011-01-31T18:26:50.363 回答
1

不,你弄错了。

  • 问题要求每个实例都有自己的一组变量,那么为什么要将AB的数据声明为static
  • 你不需要实现任何东西。问题只是要求您声明类型及其成员数据。
  • 就需求要求您执行的操作而言,构造函数也不是必需的。
于 2011-01-31T18:28:55.877 回答
0
class A{
protected:
    char var1,var2;
};

class B: public A {
private:
    char var3;
};

void main()
{
    B b1;
    b1.var3='a';
}
于 2011-01-31T18:50:32.577 回答