您好我正在开发一个C ++程序,我刚刚开始创建一些我创建的类中的示例对象。我正在创建对象,但由于某种原因,点运算符不使用对象
这是对象调用
Card testcard(Suit hearts, Value six);
这是构造函数
Card::Card(Suit suit, Value facevalue)
{
Card::suit=suit;
Card::faceValue=facevalue;
};
然而点运算符不起作用,好像对象实际上并不存在
我在单独的部分控制大部分程序,所以有很多头文件的实例,这是卡类所在的位置,我不确定这是否是问题的一部分
答案 0 :(得分:4)
在实例方法中,您不能使用点来访问实例。
请尝试this->
:
Card::Card(Suit suit, Value facevalue)
{
this->suit=suit;
this->faceValue=facevalue;
};
或者,您可以使用初始化列表:
Card::Card(Suit suit, Value facevalue) : suit(suit), faceValue(facevalue)
{ }
答案 1 :(得分:3)
假设班级看起来像:
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;
}
答案 2 :(得分:2)
这是对象调用
Card testcard(Suit hearts, Value six);
不,这是一个功能声明。自然地使用函数名称上的成员访问运算符(.
)不起作用,该函数有自己的类型,没有成员。
要声明自动变量(创建新的对象实例),请不要重复参数类型。只是说:
Card testcard(hearts, six);
答案 3 :(得分:1)
我认为你的一些命名惯例会给你带来一些困惑。如上所述,您遇到了传递给构造函数的 suit 和 facevalue 参数的上下文问题。这意味着在构造函数方法的上下文中,suit实际上意味着作为参数传递的套装,而不是作为类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 ++语法的一部分,表明您正在取消引用该类。如果您已将 suit 和 facevalue 数据成员声明为 static ,那么该语法将起作用,但这不是什么你想做。
你提到你在多个头文件中声明了Card类 - 这也很糟糕。