【问题标题】:c++ objects with constructors taking values into encapsulated objects带有构造函数的 c++ 对象将值放入封装的对象中
【发布时间】:2014-10-19 04:44:44
【问题描述】:

我一直在试图弄清楚 c++ 如何处理多个对象,构造函数接收值,它们是在彼此内部设置的。

#include <iostream>
using namespace std;

class Inner {
  int myvar;
public:
  Inner(int input) {
    myvar = input;
  }

  int output() {
    return myvar;
  }
};

class Outer {
  Inner inner;
public:
  Outer(int input) {
    Inner inner(input);
  }

  int value_out() {
    return inner.output();
  }
};

int main() {
  int myvar = 0;
  Outer outer(myvar);
  cout << outer.value_out() << endl;
  return 0;
}

我去编译时的控制台输出:

ubuntu@ubuntu:~$ cd Desktop
ubuntu@ubuntu:~/Desktop$ touch test.cpp
ubuntu@ubuntu:~/Desktop$ g++ test.cpp -o test
test.cpp: In constructor ‘Outer::Outer(int)’:
test.cpp:19:20: error: no matching function for call to ‘Inner::Inner()’
   Outer(int input) {
                    ^
test.cpp:19:20: note: candidates are:
test.cpp:7:3: note: Inner::Inner(int)
   Inner(int input) {
   ^
test.cpp:7:3: note:   candidate expects 1 argument, 0 provided
test.cpp:4:7: note: Inner::Inner(const Inner&)
 class Inner {
       ^
test.cpp:4:7: note:   candidate expects 1 argument, 0 provided
ubuntu@ubuntu:~/Desktop$ 

我是 C++ 新手,所以只是想更好地了解一切是如何落实到位的。我来自像 python 和 ruby​​ 这样的脚本语言,其中很多都是自动完成的。谢谢你的帮助!

这就是我在 Ruby 中尝试做的事情,如果这有助于更好地说明我在这里想要做什么......

class Inner
  def initialize(input)
    @myvar = input
  end

  def output
    @myvar
  end
end

class Outer
  def initialize(input)
    @inner = Inner.new(input)
  end

  def value_out
    @inner.output
  end
end

myvar = 0
outer = Outer.new(0)
puts outer.value_out

所以我想我的问题的核心是如何编写一个对象,它有一个默认构造函数作为另一个对象的成员变量,因为如果我将任何东西分配给一个成员变量,c++ 会发疯。那么,如果对象是另一个对象的成员变量,那么如何在需要输入的对象中输入任何内容呢?这是否可能,或者我是否正在尝试做一些非常愚蠢和糟糕的事情?

【问题讨论】:

  • Inner() = default; 或 Inner() {}。此外,在您的构造函数中,您没有初始化inner。 Outer(int input) : inner(input).
  • 试图理解这一点,但它只是让我头脑清醒。再读一遍那篇文章。我尝试编辑代码并用发布的内容替换东西,但它对我来说变得更糟,我变得更加困惑。只是要读这个,直到我以某种方式掌握它为止。

标签: c++ object constructor encapsulation


【解决方案1】:

我想你对构造函数体中使用的成员变量inner和inner有点困惑

在你的构造函数体中,

Outer(int input) {
  Inner inner(input);
}

变量inner 不是类成员。它是函数范围内的局部变量。要初始化类成员,您需要使用:

Outer(int input) : inner(input) {}

【讨论】:

  • 我可能需要把这一切都写出来,我真的很笨,我就是做不出来。另外,如果可以的话,我会投票给你......
  • @user3712902,不必灰心。我们都在某个时候从基础开始。尝试从 cmets 到您的帖子和这个答案的意义。用不了多久,这些就会成为第二天性。
  • 当我将内部设置为“内部(输入){}”时,它认为我只是在尝试进行函数调用,不承认我在谈论变量/对象实例内部......
  • 我对对象内部的常量声明感到非常困惑,是内部内部;错了还是我应该放 Inner inner() ?我什至不,放弃过夜。
  • 我想我会回到 ruby​​,我根本无法在 c++ 中做同样的事情......
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2011-02-20
  • 2018-05-09
  • 2018-12-24
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多