c++ - 如何在不实例化的情况下访问成员变量,C++

标签 c++ class inheritance constructor static-members

假设我有一个类 B,它在构造函数中从另一个类 A 中获取一个值“v”。我如何从类 C 中读取这个值? C 类将按需实例化,但 A 已经创建了 B 并传递了 'v'。 'v' 将在每个实例化中发生变化。我试图在 B 类中使“v”静态化。它会起作用吗?我无法正确实现它。

Class A {
 public:
 int* v;
 B b1;
 A(int* var) : v(var), b1(var) {};
}

如何从 C 类访问相同版本的“v”? 我可以根据自己的喜好定义 B 和 C 以实现目标。但我不能为此更改 A。

最佳答案

你需要一个(公共(public))静态成员

class A { //let's stick with your naming convention!
public:
  static int a;
}

A::a = 4;

然而,允许人们更改 A::a 意味着您的程序可能最终会依赖于全局未封装状态...这通常是糟糕设计的标志。

如果您的成员是 const,那么您实际上是在将一个常量与您的类相关联,这还不错。

class A {
public: 
  static const int a = 4;
}

std::cout << "A:a is always " << A::a << std::endl;

根据更新的问题进行编辑 如果您在构建类方面需要帮助,我建议您使用某种工厂。如果我理解您的要求,您希望能够为每个 A 类和 B 类实例注入(inject)一个值。此值“v”基于 C 类。

所以...

class C {
private:
  // up to you where you implement the getUniqueNumberForNow function
  // (global free function for example)
  static const int v = getUniqueNumberForNow();
public:
  static A createA(){
    return A(v);
  }
  static B createB(){
    return B(v);
  }
}

getUniqueNumberForNow() 函数只是获取您应有的值。然后它将存储在 class C 中,并且可以在创建 A 和\或 B 时使用。现在只需将 AB 的 CTOR 设为私有(private),并将 C 设为两者的 friend,您将只有创建 AB 的一种方法,它将始终使用正确的值。

有关好友类(class)的信息,请参阅下面评论中 NeilMonday 的链接。

最后一件事是,如果您想为 A 的每个实例更改值,您可以在工厂中执行此操作:

  static A createA(){
    return A(getUniqueNumberForNow());
  }

但是,如果那是真的您想要的,那么就这样做:

class A {
public:
  A() : val (getUniqueNumberForNow()), b(B(val)){}
}

关于c++ - 如何在不实例化的情况下访问成员变量,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22301141/

相关文章:

C++:提升文件系统以返回早于特定时间的文件列表

c++ - 类不能包含内部定义枚举的运算符函数?

C++类和继承错误: undefined reference to derived class

java - java中继承中实现代码重用

c++ - 继承:没有合适的默认构造函数可用

关于命名空间和别名的 C++ 混淆 : no nesting and no using directives

c++ - 我可以使用别名模板专门化一个类模板吗?

C++ 使用带有在头文件中定义的全局变量的 C 库

C++构造函数默认值头文件

java - 你在子类中调用 super.finalize() 吗?