【问题标题】:Can't assign a value to a variable inside a class [closed]无法为类内的变量赋值[关闭]
【发布时间】:2018-03-13 21:53:05
【问题描述】:
#include <iostream>

using namespace std;

class Foo {

    int i;
    int * p = new int;
    *p = 5; // This doesn't worl
    // If I instead use  int * p = new int(5); it works.
};

为什么?我看到这只发生在一个类中,如果我在主函数上编写相同的代码,它应该可以工作。

【问题讨论】:

  • 不起作用的东西是无效的语法。
  • 因为这样的表达式需要在函数内部。
  • 一个是p的初始化,另一个是*p的赋值。只允许在块范围之外进行初始化。

标签: c++ class c++11 pointers


【解决方案1】:

类定义由其成员声明组成(如果类包含成员)。除了类定义中的声明之外,您不能使用语句。

你的类定义中的这个语句

*p = 5; // This doesn't worl

不是声明。而不是这两个语句

int * p = new int;
*p = 5; // This doesn't worl

你可以只写声明

int * p = new int( 5 );

注意标准智能指针std::unique_ptr,它可以用来代替类定义中的原始指针。在这种情况下,当对象停止存在时,内存将自动释放。例如

std::unique_ptr<int> p{ new int(5) };

【讨论】:

    【解决方案2】:

    此语法无效。您不能简单地在类定义中编写代码。相反,您可以编写一个函数,您的代码将在其中运行:

    class Foo {
    public:
      void bar() {
        int * p = new int;
        *p = 5;
      }
    };
    
    int main(int argc, char ** argv) {
      Foo f;
      f.bar();
    }
    

    注意:您应该尽可能在单个语句中分配和初始化变量:

    int *p = new int(5);
    

    代替:

    int * p = new int;
    *p = 5;
    

    【讨论】:

    • 这不会默认初始化p...
    • 我试图让示例尽可能接近问题。为什么会困扰你?
    • 不打扰我:-) 但是在int *p = new int(5) 的情况下,p 将在对象构造过程中被初始化。在某些情况下,例如在默认初始化Foo-objects的向量时,创建对象后必须调用方法非常不方便。
    • 无需说服我 :) 我同意你的看法。我将编辑答案以包含一个更好的示例。
    【解决方案3】:

    我写这篇文章的假设是您需要动态分配一个成员,并且无论出于何种原因,您都不能简单地将参数传递给它的 c'tor(该类应该重新设计,但这是另一个问题)。

    要在类定义中初始化变量时执行几个语句,可以将其包装在 lambda 中,然后立即调用它:

    class Foo {
        int i;
        int * p = []() {
            auto *ret = new int;
            *ret = 5;
            return ret;
        }(); // <-- Invokes the lambda right away
    };
    

    在命名空间和类范围内只允许初始化。其他语句必须出现在 lambda 提供的块范围内。

    但这很麻烦,不明智,除非你真的必须这样做,否则你不应该这样做。构造函数定义会更好。

    【讨论】:

    • 感谢您的回答 StoryTeller。但是我是编程新手,你说的 lambda 是什么意思?
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2016-12-19
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多