LINUX.ORG.RU

Запутался с C++ + static

 ,


0

1

Добрый день. Есть такой кусочек кода:

class A {
    public:
    static int i;
};

class B {
    public:
    void setVal(int j);
};

void B::setVal(int j) {
    A::i = j;
}

int main() {
    B _b;
    _b.setVal(3);
    return 0;
}

Вылетает с ошибкой:

g++ -o test_static test_static.cpp 
/tmp/ccnlzHDY.o: In function `B::setVal(int)':
test_static.cpp:(.text+0x7): undefined reference to `A::i'
collect2: ld returned 1 exit status

Подскажите, в чём ошибка плз.

Ответ на: комментарий от Dudraug

«нельзя делать переменную без сетеров и гетеров»

Я использовал слово «моветон», есть некоторая разница. Сводится восновном к тому, что можно, но не стоит того.

Но я к тому, что не стоит себя ограничивать шаблонами.

Ага давайте будем творческими, прям не в меру! Наваяем прямых обращений к полям (лень же несколько жалких строчек наваять). После определим какой-нить контейнер, накидаем в него указателей активно пользуя великий и ужасный оператор «new», пройдёмся итераторм и тут же сделаем ретёрн (зачем чистить за собой кучу?!). Не забудем, что синглтон - «антипаттерн», потому наваяем тону извратного говнокода. Етц. После с горем пополам доводём этот хлам до состояния компилябельности, проработав несколько суток в дебагере. При потребности элементраной правки будем убивать многие часы/сутки времени. И как всегда обвиним компилятор, ЯП, кого угодно ещё. Ну не мы же быдлокодеры то! ЗЫ утрирую, но в некоторых случаях доходит и до настолько плохого расклада и даже хуже. ЗЗЫ примеры классика жанра.

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

Ага давайте будем творческими, прям не в меру! Наваяем прямых обращений к полям

Я этого не говорил, учись читать блин

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

Такие вопросы возникают на раннем этапе проектирования, так что незачет

Живая программа - сущность динамичная. Даже говоря о жизни проекта часто говорят «да там уже пол года не комитили», и это приводят как признак трупа. Проектированние необходимо производить правильно, и заглядывание в возможное будущее есть составляющая правильного проектирования. Проектировать гробницу фараона != проектировать программу.

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

Ну как бы ты же сказал про «раннее проектирование», просто ситуация «не нужно сейчас, не нужно через год, а через 5 лет станет нужным» вполне вероятна и часто встречается.

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

В один прекрасный момент, ВНЕЗАПНО, нам понадобилось реализовать какую-то логику для поля «int x», или другими словами потребовалась инкапсуляция

В один прекрасный момент, тебе потребуется изменить внутреннюю реализацию всего твоего класса, что потребует переписать все твои методы. И в этом нет ничего плохого. Моя основная посылка: инкапсуляция ради инкапсуляции не нужна.

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

Не, ну ты просто начал капитанить, вот я и не выдержал.

просто ситуация «не нужно сейчас, не нужно через год, а через 5 лет станет нужным»

я такого не говорил

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

В один прекрасный момент, тебе потребуется изменить внутреннюю реализацию всего твоего класса, что потребует переписать все твои методы.

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

И в этом нет ничего плохого.

Это в чём-то даже очень хорошо.

Моя основная посылка: инкапсуляция ради инкапсуляции не нужна.

Не так страшна инкапсуляция, как её малюют былокодеры. Обычно геттер+сеттер - пара строк в заголовочном файле. Отнимаемые на это время и силы стремятся к нулю. И тоговый код бинарный код от этого по сути и не меняется, будет компилиться в то же прямое обращение к полю. Но вот когда тебе понадобится изменить логику, надо просто переписать реализацию этих двух методов. Если изначально поленился с этими двумя строчками (ибо «инкапсуляция ради инкапсуляции не нужна») то такая простая правка выльется в поиск и исправление обращений к полю по всему исходнику. Дык нахрена ж себе грабли раставлять?!

ЗЫ вот с такой логикой как у тебя на выходе и получается каша вместо кода, тут пару строк поленимся, там проявим безотвественность при использовании указателей, там при проектировании забъём на возможность будующих изменений, где-то воспользуемся идиотской модой неосиливать простые наработаные годами решения и будем ваять что-то через жопу. Простой рецепт как приготовить говнокод: проявлять халатность по мелочам.

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

Такие вопросы возникают на раннем этапе проектирования, так что незачет

я такого не говорил

/0 Не вертись как уж на сковородке.... будь мужЫкомъ.

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

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

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

Как часто у тебя приходилось менять «логику» доступа к отдельным полям, которые ты сознательно пометил как открытые? Или ты говоришь о сферическом коде в вакууме?

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

Как часто у тебя приходилось менять «логику» доступа к отдельным полям, которые ты сознательно пометил как открытые?

В своих прораммах ни разу (КО подсказывает, я прямого доступа к полям не делаю). В чужом коде бывало.

Или ты говоришь о сферическом коде в вакууме?

Конечно, мне же более не о чём говорить...

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

Аргументы кончились уже давно... Вбросы всё жирнее и жирнее... Может сразу на личности перейдём?!

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

Ты начал вместо аргументированного спора на сферические ваакумы и личности. Я таки дела. свой вывод: 1 ты школо-ло; 2 аргументов у тебя не осталось по причине «см. 1». Дальнейший спор с школо-ло нахожу бессмысленым, дальше будет только упёртое баранье млеяние с обвинение в чём угодно, тупым отрицание очевидного и полным нулём по сабжу.

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

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

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

Я свои аргументы приводил выше, если ты их удосужился прочитать.

Удосужился и привёл свои. В ответ получил тупое отрицание сказанного мной, без аргументов. И переход на личности.

А вот то, что именно ты перешел на личности

4.2

уже дает мне право дать тебе однозначную характеристику

Имеешь право думать обо мне что угодно, но вот кем ты себя возомнил чтоб ваять для меня характеристику?!

Но я ее озвучивать не буду

Я бы послушал, наверняка забавно.

ЗЫ перди в лужу дальше, диолог окончательно потерял последние намёки на конструктивность. ББ!

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

но вот кем ты себя возомнил чтоб ваять для меня характеристику?!

ну ты же мне подробную характеристику дал, почему мне так же нельзя?

А вот то, что именно ты перешел на личности

4.2

Ну и где ты там увидел переход на личности-то? Приведи конкретную фразу, а то мне самому интересно, чем я тебя так обидел, что ты начал выдавать перлы:

школоло

баранье млеяние

перди в лужу дальше

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