Переменные C ++ - объявляют и определяют. наследование - PullRequest
6 голосов
/ 31 января 2011

Давайте создадим объект C ++ A. Есть две переменные (VAR1 и VAR2) в A, доступные его дочерним элементам.Объект B расширяет A и имеет одну личную переменную VAR3, к которой он также может обращаться к VAR1 и VAR2.Каждый экземпляр A / B имеет свои собственные переменные.

Будет ли это правильным способом объявления и определения переменных?

Ah


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;

Bh


#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 голосов
/ 31 января 2011

Каждый экземпляр A / B имеет свои собственные переменные.

Это был бы правильный способ объявления и определения переменных?

Нет.Вы объявили A члены как static, что означает, что они являются переменными класса, а не переменными экземпляра.Каждый экземпляр не получает свою собственную копию.Вместо этого все они используют один и тот же экземпляр.

Make затем non- 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 голос
/ 31 января 2011

Нет, вы ошиблись.

  • Проблема требует, чтобы каждый экземпляр имел свой собственный набор переменных, так почему вы объявляете данные A и B как * 1006?*?
  • Вам не нужно ничего реализовывать.Проблема просто требует, чтобы вы объявили типы и их данные-члены.
  • Конструктор также не нужен, если вас просят выполнить требования.
1 голос
/ 31 января 2011

Каждый экземпляр A / B имеет свои собственные переменные.

Не так.Вы объявили их static.Прекратите это делать, и вы можете приблизиться к желаемому результату.

0 голосов
/ 31 января 2011
class A{
protected:
    char var1,var2;
};

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

void main()
{
    B b1;
    b1.var3='a';
}
...