【问题标题】:C++ Variables - declare and define. InheritanceC++ 变量 - 声明和定义。遗产
【发布时间】:2011-06-18 18:39:33
【问题描述】:

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

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

啊.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.
}

【问题讨论】:

    标签: c++ variables scope declare


    【解决方案1】:

    每个 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") {};
    

    【讨论】:

    • @downvoter:请解释一下,以便改进这篇文章
    • @downvoter:如果你不喜欢被称为朋克,那我只是在开玩笑:)
    • 您好,谢谢。在阅读了有关外部变量与静态变量的内容后,我有点困惑......所以,总结一下。我将所有声明设为非静态,删除所有定义并在构造函数中赋值。对吗?
    • extern 和 static 都有很多重载的含义,很容易混淆。大多数情况下,最好的方法是不使用限定词,除非您知道自己需要它们以及为什么需要它们。
    【解决方案2】:

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

    并非如此。您已将它们声明为static。停止这样做,您可能会更接近您想要的结果。

    【讨论】:

      【解决方案3】:

      不,你错了。

      • 问题要求每个实例都有自己的一组变量,那你为什么将AB的数据声明为static
      • 您不需要实现任何东西。问题只是要求您声明类型及其成员数据。
      • 就要求您执行的操作而言,构造函数也不是必需的。

      【讨论】:

        【解决方案4】:
        class A{
        protected:
            char var1,var2;
        };
        
        class B: public A {
        private:
            char var3;
        };
        
        void main()
        {
            B b1;
            b1.var3='a';
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-30
          • 2013-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多