LINUX.ORG.RU

идиотский вопрос по с++


0

0

Подозреваю что вопрос совершенно идиотский, но никак не могу понять в чем суть.
Есть у меня класс. В упрощенном виде он выглядит так:

class MyClass {
private:
MyClass();
~MyClass();
vector<string> data;
unsigned int size() { return data.size(); }
};

далее в коде я передаю переменную этого класса в функцию, и хочу вызывать оттуда size():
void some_function(const MyClass &dataClass) {
printf("size: %d\n", dataClass.size();
}

На что g++ естественно ругается: passing ‘const MyClass’ as ‘this’ argument of ‘unsigned int MyClass::size()’ discards qualifiers

Вопроса два: 1) почему так нельзя, 2) можно ли сделать так, чтоб было можно, но при этом все равно передавая константную ссылку?

Скобку забыл: printf("size: %d\n", dataClass.size());
Но сути дела не меняет.

aix27249
() автор топика

Когда ты работаешь с ссылкой на константу (а это как раз dataClass в ф-ии some_function), ты у объекта данного класса можешь вызывать только константные методы.

Солюшн - написать в классе так:
unsigned int size() const { return data.size(); }

yoghurt ★★★★★
()

> private:

копай отсюда. Хинт:

public:

unsigned int size() { return data.size(); }

К тому же, ты уверен, что конструктор тоже надо делать private? Откуда у тебя будут объекты плодится? Из твоего кода объект класса создать невозможно как в принципе, кроме какого-нибудь глупого преобразования указателя на кучу мусора.

Spectr ★★★
()
Ответ на: комментарий от aix27249

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

MYMUR ★★★★
()
Ответ на: комментарий от Spectr

Возможно он потом добавит метод getInstance() ;)

Ian ★★
()
Ответ на: комментарий от MYMUR

> Возьми за хорошую привычку объявлять константными все методы, не меняющие состояние класса. Сэкономишь кучу нервов себе и коллегам.

В C++ много таких привычек нужно выработать :) Например, отражённая в вопросе привычка передавать аргументы через const T&.

const86 ★★★★★
()
Ответ на: комментарий от MYMUR

>Возьми за хорошую привычку объявлять константными все методы, не меняющие состояние класса. Сэкономишь кучу нервов себе и коллегам.

Обязательно возьму) Просто знания плюсов у меня на уровне "сколько требовалось для выполнения задачи", отчего пробелов в них много - я вот, к примеру, даже не слышал раньше про константные методы.

aix27249
() автор топика

Метод должен быть const: void some_function(const MyClass &dataClass) const; или убери конст из параметра и передавай по значению. void some_function(MyClass dataClass); Но первый вариант лучше так как не будет вызиваться конструктор копирования.

patriotyk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.