Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2011, 16:31   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию Передать аргументы метода класса сразу в его член.

Вообщем хотелось бы передавать в класс информацию так, что-бы она сразу становилась его членом, не хочу плодить лишние присваивания. Попробовал дать имя аргументу метода, совпадающее с именем члена класса, но что-то не работает. Это вообще возможно?

Код:
#include<iostream>
#include<string>
using namespace std;

class Some {
public:
Some(string temp) : str(temp)
                        {   }
    string str;
    void method(string str) {
    cout<<"current str is:"<<str<<endl;
    }
};

int main() {
    Some some(string("str"));
    cout<<"current str is: "<< some.str<<endl;
    some.method(string("envoce"));
    cout<<"current str is: "<< some.str<<endl;
return 0;
}
the_deer_one вне форума Ответить с цитированием
Старый 24.02.2011, 16:36   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Если вы просто назовёте аргумент так же, как одно из полей, естественно ничего не произойдёт. Но будет одно неудобство — http://en.wikipedia.org/wiki/Variable_shadowing
Код:
    void method(string str) {
        this->str = str;
        cout<<"current str is:"<<str<<endl;
    }
Чтобы этого избежать, именуйте поля класса, например, как m_str. То есть начинайте с m_.
И вообще, открытые поля — зло.
Если у вас есть поле m_my_str, то должен быть геттер string myStr() const и сеттер void setMyStr(string str), а само поле должно быть приватным.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 25.02.2011 в 10:01.
Obey-Kun вне форума Ответить с цитированием
Старый 24.02.2011, 17:22   #3
Ru_DoLF
Ubuntu 10.04
Пользователь
 
Аватар для Ru_DoLF
 
Регистрация: 15.07.2010
Сообщений: 51
По умолчанию

Цитата:
что-бы она сразу становилась его членом
Есть в спп такая возможность, но она распространяется только на конструкторы.

Код:
class someClass
{
public:
	someClass(int var) : mVar(var)
	{
	}
private:
	int mVar;
};
P.S. А вообще тебе Obey-Kun правильно говорит. Сделай геттеры и сеттеры и используй их когда тебе надо модифицировать член-данные класса.
Язык образует среду мышления и формирует представление о том, о чем мы думаем (Б. Л. Уорф)
Ru_DoLF вне форума Ответить с цитированием
Старый 24.02.2011, 17:27   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
Есть в спп такая возможность, но она распространяется только на конструкторы.
ОП это и так умеет, посмотрите его код. Кстати, там проблем, аналогичных variable shadowing, уже не будет
Код:
class SomeClass
{
public:
    SomeClass(int var): var(var) { }
private:
    int var;
};
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 25.02.2011 в 10:28.
Obey-Kun вне форума Ответить с цитированием
Старый 24.02.2011, 17:31   #5
Ru_DoLF
Ubuntu 10.04
Пользователь
 
Аватар для Ru_DoLF
 
Регистрация: 15.07.2010
Сообщений: 51
По умолчанию

Цитата:
Вообщем хотелось бы передавать в класс информацию так, что-бы она сразу становилась его членом
Цитата:
Это называется списком инициализации и к теме вопроса отношения не имеет
Да ладно?
P.S. Увеличиваю длину сообщения.
Язык образует среду мышления и формирует представление о том, о чем мы думаем (Б. Л. Уорф)
Ru_DoLF вне форума Ответить с цитированием
Старый 24.02.2011, 17:32   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Исправил до того, как ты написал это сообщение...
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 24.02.2011, 17:33   #7
Ru_DoLF
Ubuntu 10.04
Пользователь
 
Аватар для Ru_DoLF
 
Регистрация: 15.07.2010
Сообщений: 51
По умолчанию

Цитата:
ОП это и так умеет
Не увидел.
P.S. Увеличиваю длину сообщения.

Цитата:
Исправил до того, как ты написал это сообщение...
Не обновлял страницу, как увидел пост сразу начал отвечать
Язык образует среду мышления и формирует представление о том, о чем мы думаем (Б. Л. Уорф)

Последний раз редактировалось Stilet; 25.02.2011 в 10:31.
Ru_DoLF вне форума Ответить с цитированием
Старый 25.02.2011, 09:51   #8
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Obey-Kun
Цитата:
Но будет одно неудобство
Походу я открыл ещё один способ застрелить себя в ногу. )

Obey-Kun
Цитата:
И вообще, открытые поля — зло.
Если у вас есть поле m_my_str, то должен быть геттер myStr() и сеттер setMyStr(), а само поле должно быть приватным.
А что не так с открытыми полями? Чем (закрытое поле + метод для чтения + метод для записи), лучше чем (открытого поле)?
the_deer_one вне форума Ответить с цитированием
Старый 25.02.2011, 10:17   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
А что не так с открытыми полями? Чем (закрытое поле + метод для чтения + метод для записи), лучше чем (открытого поле)?
Как минимум тем, что это очень упрощает дебаггинг в дальнейшем. А когда тебе захочется при изменении поля класса делать что-то ещё, пришлось бы вводить сеттер, не будь его заранее. Открытые поля плюют на одного из слонов ООП —инкапсуляцию.

Также бывает нужно (причем очень и очень часто), что нужен или только геттер, или только сеттер.

В некоторых языках программирования введено специальное понятие "свойство" (property), дабы не плодить геттеры и сеттеры и приблизиться к идеологии ООП из коробки.

Чтобы не захламлять код, делай так:
Код:
class Foo
{
public:
    const std::string &bar() const { return m_bar; } // обрати внимание - константная ссылка!
    void bar(const std::string& bar) { m _bar = bar; } // и тут тоже ссылка константная в аргументах
    int otherBar() const { return m_other_bar; } // а тут уже не ссылка
    void setOtherBar(int other_bar) { m_other_bar = other_bar; } // и тут в аргументах не ссылка
private:
    std::string m_bar;
    int m_other_bar;
};
Если ты не знал, практически для всех стандартных типов C (и элементов из enum ) лучше передавать и возвращать всю фигню по значению... для прочего константные ссылки будут менее затратными. Всё дело в размере указателя.

А вот для C-style структур, естественно, можно делать сплошь открытые поля. Но только дня них.

Цитата:
Походу я открыл ещё один способ застрелить себя в ногу. )
Просто именуй поля с m_.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 25.02.2011 в 10:27.
Obey-Kun вне форума Ответить с цитированием
Старый 25.02.2011, 10:41   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вообщем хотелось бы передавать в класс информацию так, что-бы она сразу становилась его членом
Извиняюсь, конечно, но я правильно понял эту фразу как: На лету добавлять поля класса, которые с момента добавлений становятся доступны всем объектам такого класса
Или это я затупил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вектор как закрытый член класса, как изменять его значения? Zhigool' Общие вопросы C/C++ 3 08.08.2010 23:19
Как передать адрес метода из dll в приложение и присвоить его событию OnClick? puga555 Общие вопросы Delphi 1 22.12.2009 17:04
Функция - член класса Syltan Общие вопросы C/C++ 9 06.10.2009 23:44
Указатеть на функция-член класса BioS Общие вопросы C/C++ 6 29.09.2009 00:04
Как изменить статический приватный член класса?? 3dgraph Помощь студентам 2 07.05.2009 20:06