【问题标题】:C++ object not working with dot operatorC++ 对象不能与点运算符一起使用
【发布时间】:2012-09-11 09:11:12
【问题描述】:

您好,我正在开发一个 C++ 程序,我刚开始从我创建的类中创建一些示例对象。我正在创建对象,但由于某种原因,点运算符无法使用该对象

这是对象调用

Card testcard(Suit hearts, Value six);

这是构造函数

Card::Card(Suit suit, Value facevalue)
{
Card::suit=suit;
Card::faceValue=facevalue;
};

但是点运算符不起作用,好像对象并不真的存在

我将大部分程序控制在单独的部分中,因此卡类所在的头文件有很多实例,我不确定这是否是问题的一部分

【问题讨论】:

  • 您是如何尝试使用“点运算符”的?

标签: c++ object dot-operator


【解决方案1】:

在实例方法中,您不能使用点来访问实例。

改用this->

Card::Card(Suit suit, Value facevalue)
{
    this->suit=suit;
    this->faceValue=facevalue;
};

或者,您可以使用初始化列表:

Card::Card(Suit suit, Value facevalue) : suit(suit), faceValue(facevalue)
    { }

【讨论】:

  • 限定名称是访问成员的绝佳方式。
  • 是的,我知道,但他在问一些“点语法”。我认为这意味着他想通过实例显式访问它们(如 Java),但我只是在猜测。
【解决方案2】:

假设类看起来像:

class Card {
public:
    Card (Suit argSuit, Value argFaceValue);

private:
    Suit   m_Suit;
    Value  m_FaceValue;
};

构造函数看起来像这样。由于类的成员可用于从类创建的对象,因此您无需执行任何特殊操作即可访问它们。类的成员在范围内并且是可见的。您只需要确保函数的参数列表使用与类/对象成员不同的符号或名称。

Card::Card(Suit argSuit, Value argFaceValue)
{
    m_Suit = argSuit;
    m_FaceValue = argFaceValue;
}

【讨论】:

  • 但是使用限定名称是一种非常有效的方式来引用已隐藏的成员(通过本地或参数)。
  • 真正想要做的是使用构造函数初始化列表,假设SuitValue有复制构造函数。
【解决方案3】:

这是对象调用

Card testcard(Suit hearts, Value six);

不,这是一个函数声明。在函数名称上使用成员访问运算符 (.) 自然是行不通的,函数有自己的类型,没有成员。

要声明一个自动变量(创建一个新的对象实例),不要重复参数类型。直接说:

Card testcard(hearts, six);

【讨论】:

    【解决方案4】:

    我认为您的一些命名约定给您带来了一些困惑。如上所述,您遇到了传递给构造函数的 suitfacevalue 参数的上下文问题。这意味着在构造方法的上下文中,西装实际上意味着作为参数传入的西装,而不是作为类 Card 的成员变量的西装。人们通常使用命名约定来帮助避免这种混淆,例如在类的每个数据成员前面放置一个 m_,这样 suit 就会变成 m_suit。你可以使用任何你喜欢的东西,但是这样其他人的代码会马上知道 m_suit 是一个数据成员。

    另外一点是,您可以并且可能应该在执行构造函数的代码之前初始化类的数据成员。这称为“初始化列表”,将按如下方式完成(假设您已更改为上述命名约定)。

    Card::Card (Suit suit, Value facevalue)
     : m_suit (suit), m_facevalue (facevalue)
    {
        // no code needs to go here
    }
    

    出于效率原因,养成这个习惯是个好主意。此外,在构造函数中使用 this 指针通常不是一个好主意。这并不违法,但会给你带来麻烦。

    就点运算符不起作用而言,您的问题并不清楚您在哪里使用点运算符。如果您指的是上面的 :: 语法,那并不是真正的运算符,它是 C++ 语法的一部分,表明您正在取消引用该类。如果您将 suitfacevalue 数据成员声明为 static,则该语法会起作用,但事实并非如此你想做。

    你提到你在多个头文件中声明 Card 类——这也很糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多