Форум программистов, компьютерный форум CyberForum.ru

Как созадть такой экземпляр? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.04.2011, 09:10     Как созадть такой экземпляр? #1
Пусть есть класс:
C++
1
2
3
4
5
6
class A
{
 protected:
  type field;
....
};
а выше описан тип (возможно класс, или структура) type, или макрос type - синоним существующего (возможно стандартного) типа. В классе нет открытых членов, прямо, или косвенно пишуших член field. Как создать экземпляр класса A с определённым значением члена field?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
07.04.2011, 10:56     Как созадть такой экземпляр? #2
C++
1
2
3
4
5
6
7
8
class A
{
protected:
    type field;
 
public:
    A(type _f): field(_f) {};
};
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.04.2011, 15:01     Как созадть такой экземпляр? #3
Унаследовать от него класс B, который будет настраивать field.)
И использовать через указатель на А.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.04.2011, 12:33  [ТС]     Как созадть такой экземпляр? #4
А наследник будет иметь методы методы, записывающие данное поле? Не пойдёт.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.04.2011, 14:40     Как созадть такой экземпляр? #5
Конструктор тебя точно не устраивает?
Тогда, можно дружественную функцию сделать.

А это праздный интерес или реально такая проблема возникла?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.04.2011, 21:38     Как созадть такой экземпляр? #6
Наверное, никак. Действительно, ты все конструкторы определяешь сам, а которые не определяешь, те обнуляют все поля.
А конструкторы использовать нельзя, ибо они открыты. Тупик.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.04.2011, 22:40     Как созадть такой экземпляр? #7
kravam, Нифига они не обнуляют по крайней мере ПОД-ы.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.04.2011, 22:55     Как созадть такой экземпляр? #8
А ну да я перепутал, это такой обнуляет
C++
1
konstruktor () {};
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
13.04.2011, 23:13     Как созадть такой экземпляр? #9
а зачем нужен класс к которому не достучаться???

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Как создать экземпляр класса A с определённым значением члена field?
создай константу
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.04.2011, 23:46     Как созадть такой экземпляр? #10
kravam, Я так понимаю ты опять перепутал, да?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class some_c
{
public:
    some_c() { }
    int getT() const {return t;}
private:
    int t;
};
 
int main()
{
    some_c s;
    std::cout<<s.getT()<<'\n';
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.04.2011, 23:53     Как созадть такой экземпляр? #11
"Поведение конструктора по умолчанию, добавляемого компилятором, заключается в установке всех данных-членов в ноль"

Брайан Оверленд, "С++ без страха", издательство "Триумф", Москва, 2005.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.04.2011, 00:13     Как созадть такой экземпляр? #12
kravam, цитировать авторитетов, это, конечно, хорошо, но всё же верить своим глазам как-то привычнее. А они сообщают мозгу следующую информацию:
При использовании конструктора, сгенерированного компилятором, в переменных содержится мусор.
По крайней мере MSVC и gcc поступают именно так.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.04.2011, 06:20  [ТС]     Как созадть такой экземпляр? #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда, можно дружественную функцию сделать.
Без друзей.
Цитата Сообщение от Deviaphan Посмотреть сообщение
Конструктор тебя точно не устраивает?
Только если можно ограничить число его применний. А в саммом классе никак нельзя прописать создание экземпляра? Что нибудбь типа
C++
1
2
3
4
5
6
class A
{
 static A o;
 ...
};
...
?

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а зачем нужен класс к которому не достучаться???
Кто сказал,ч то к нему нельзя достучаться? Методы, читающее упомянутое поле, будут обязательно, а не будет методов, пишуших это же поле.
Цитата Сообщение от ValeryS Посмотреть сообщение
создай константу
Как?

Добавлено через 15 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
а зачем нужен класс к которому не достучаться???
Кто сказал,ч то к нему нельзя достучаться? Методы, читающее упомянутое поле, будут обязательно, а не будет методов, пишуших это же поле.
Цитата Сообщение от ValeryS Посмотреть сообщение
создай константу
Как? Причём, нужна не итовая, например, константа, а именно константный объект.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.04.2011, 07:03     Как созадть такой экземпляр? #14
Цитата Сообщение от kravam Посмотреть сообщение
это такой обнуляет
В дебаге обнуляет, да. Но только в дебаге. В релизе никакой лишней работы без спросу не выполняется.

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Только если можно ограничить число его применний.
Т.е. это синглтон с неожиданными требованиями?
Не совсем понятна природа данных ограничений. Точнее, совсем не понятна.

Вот зря не хочешь с наследованием делать. Можно было бы два интерфейс сделать. оДин на чтение, второй для записи. И повсеместно использовать только читающий интерфейс.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.04.2011, 07:05  [ТС]     Как созадть такой экземпляр? #15
Цитата Сообщение от Deviaphan Посмотреть сообщение
В дебаге обнуляет, да. Но только в дебаге. В релизе никакой лишней работы без спросу не выполняется.
Кто сказал, что она лишняя? Отладил ты в дебаге, потом слепил релиз, а из-за того, что релизный конструктор не обнуляет, полезли глюки, но отладочной инфы уже нет и фиг ты найдёшь, откуда глюки. Вывод: дебаг негоден для дебага. Всё относящееся к явно объявленным и явно читаемым данным должно совпадать, лишенй эта работа не будет, иначе это не дебаг. Различаются же эти версии тем, что в релизе нет отладочной инфы, из-за чего дебагеры не могут наблюдать его исполнение. Кстати, я вообще избегаю дефолтных конструкторов. Не доверяю им и именно из-за незнания их поведения в отношении полей объекта. Но если нет указателей, то деструкторы у меня дефолтные.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.04.2011, 07:09     Как созадть такой экземпляр? #16
Цитата Сообщение от taras atavin Посмотреть сообщение
Кто сказал, что она лишняя?
Если программист не стал инициализировать переменную, значит, инициализация не нужна. Соответственно, неявная инициализация - лишняя работа.
Я бы и в дебаге обнуление отключил, если бы знал как.) С другой стороны, RAII эту проблему устраняет, так что пофиг.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.04.2011, 07:13  [ТС]     Как созадть такой экземпляр? #17
Цитата Сообщение от Deviaphan Посмотреть сообщение
Т.е. это синглтон с неожиданными требованиями?
Не совсем понятна природа данных ограничений. Точнее, совсем не понятна.
Есть два конструткора, оба с параметрами, один я вызову сам и полнсотью исчерпаю его разрешенные вызовы, а второй будет подробно прокомментирован и доступен для неограниченного использования.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.04.2011, 07:18     Как созадть такой экземпляр? #18
Т.е. ты хочешь быть уверен, что первый конструктор будет вызван только один раз и до взовов второго конструктора, так?
silent_1991
14.04.2011, 07:57
  #19

Не по теме:

Цитата Сообщение от 'Deviaphan' Посмотреть сообщение
В дебаге обнуляет
У меня в 10-й студии и там не обнуляет...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2011, 08:26     Как созадть такой экземпляр?
Еще ссылки по теме:

C++ Приведите простенький пример с наследованием, чтобы понять, как создавать экземпляр класса
C++ Как передать в метод класса ссылку на экземпляр
Как создать экземпляр контейнера, содержащий контейнеры и т.д C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.04.2011, 08:26  [ТС]     Как созадть такой экземпляр? #20
Цитата Сообщение от Deviaphan Посмотреть сообщение
Т.е. ты хочешь быть уверен, что первый конструктор будет вызван только один раз и до взовов второго конструктора, так?
Я ещё посмотрю, ровно 1, или ровно 16. Но все 16 раз я его вызову сам.

Добавлено через 5 минут
Обавзательный объект должен:
1 быть контантным,
2 занимать место в памяти,
3 иметь глобальное имя,
4 быть объявлен только в моём исходнике без возможности повтороной декларации с тем же конструктором.
Как это сделать?
Yandex
Объявления
14.04.2011, 08:26     Как созадть такой экземпляр?
Ответ Создать тему
Опции темы

Текущее время: 08:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru