C ++ объект не работает с оператором точки

Здравствуйте, я работаю над программой на C ++, и я только начинаю с создания примеров объектов из класса, который я создал. Я создаю объект, но по какой-то причине оператор точки не работает с объектом

Это вызов объекта

Card testcard(Suit hearts, Value six);

Это конструктор

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

Однако оператор точка не работает, как будто объект на самом деле не существует

Я контролирую большую часть программы в отдельных частях, поэтому существует много экземпляров заголовочных файлов, в которых находится класс карты, я не уверен, является ли это частью проблемы

0

Решение

Предполагая, что класс выглядит примерно так:

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;
}
3

Другие решения

Из метода экземпляра вы не можете использовать точку для доступа к экземпляру.

Пытаться this-> вместо:

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

Кроме того, вы можете использовать список инициализатора:

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

Это вызов объекта

Card testcard(Suit hearts, Value six);

Нет, это объявление функции. Естественно, используя оператор доступа члена (.) на имя функции не работает, функция имеет свой собственный тип, который не имеет членов.

Чтобы объявить автоматическую переменную (создание нового экземпляра объекта), не повторяйте типы параметров. Просто скажи:

Card testcard(hearts, six);
2

Я думаю, что некоторые из ваших соглашений об именах приводят вас в замешательство. Как указано выше, вы сталкиваетесь с проблемой контекста подходить а также Номинальная стоимость аргументы передаются конструктору. Это означает, что в контексте метода конструктора костюм действительно означает костюм, переданный в качестве аргумента, поверх костюма, являющегося переменной-членом класса Card. Люди обычно используют соглашение об именах, чтобы избежать этой путаницы, например m_ перед каждым членом данных для класса, так что подходить станет m_suit. Вы можете использовать все, что захотите, но таким образом кто-то другой сразу поймет, что m_suit является членом данных.

Другой момент заключается в том, что вы можете и, вероятно, должны инициализировать элемент данных для класса перед выполнением кода для конструктора. Это называетсясписок инициализации«и будет сделано следующим образом (при условии, что вы перешли на соглашение об именах выше).

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

По соображениям эффективности это хорошая идея, чтобы войти в эту привычку. Далее, используя этот Указатель, как правило, не очень хорошая идея в конструкторе. Это не незаконно, но может привести к неприятностям.

Поскольку оператор точки не работает, из вашего вопроса неясно, где именно вы используете оператор точки. Если вы имеете в виду :: приведенный выше синтаксис, на самом деле это не оператор, а часть синтаксиса C ++, указывающая на то, что вы разыменовываете класс. Этот синтаксис будет работать, если вы объявили подходить а также Номинальная стоимость члены данных как статический, но это не то, что вы хотели сделать.

Вы упоминаете, что объявляете класс Card в нескольких заголовочных файлах — это тоже плохо.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector