【问题标题】:How to access a member variable without instantiation, C++如何在没有实例化的情况下访问成员变量,C++
【发布时间】:2014-03-10 13:13:03
【问题描述】:

假设我有一个类 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。

【问题讨论】:

  • 请发布一些复制您的问题的最小代码
  • 你能写一些你的代码的sn-p吗??
  • C 需要有一个实例 B 并且可以通过公共访问器访问它的成员
  • @GIJoe 如果他们是 static 成员则不要
  • 如果不显示C 与其他类的关系,我们就无法提供帮助。也许你应该描述一下你想在更高层次上实现的目标。

标签: c++ class inheritance constructor static-members


【解决方案1】:

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

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 类实例注入一个值。此值“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 中,并可在创建AB 期间使用。现在只需将AB 的CTOR 设为私有,并将C 设为两者的friend,您将只有一种方法来创建AB,并且它将始终使用正确的价值。

有关朋友课程的信息,请参阅下面 cmets 中的 NeilMonday 链接。

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

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

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

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

【讨论】:

  • 这个句柄“'v'将如何在每次实例化中改变”?
  • 您还可以使用friend 类和函数,这样它们就不会对所有人公开:en.wikipedia.org/wiki/Friend_class
  • @Computer_guy 我已经更新了答案以包括一种方法来做我认为你想要的。
  • “但是,允许人们更改 A::a 意味着您的程序最终可能会依赖于全局未封装状态……这通常是设计不佳的标志。” 这可以通过使用 private 静态变量 A::a 和公共静态 getter 来规避。
【解决方案2】:

您无法访问从未传递给班级的“v”。相反,您可以将其作为 A 类中的成员制作一个静态副本。每次实例化 A 时,它都会像这样更新:

Class A {
 public:
   int* v;
   static int* staticv;
   ...// Constructor etc
}

在您的 A 的 .cc 代码中:

int* A::staticv;
...
A::staticv=this->v;

现在任何类都可以通过以下方式访问该值:

A::staticv;

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多