Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

Важная информация

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.05.2010, 21:22   #1
Chaosua
Новичок
 
Аватар для Chaosua
 
Регистрация: 07.03.2010
Сообщений: 4
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Chaosua На верном пути
По умолчанию класы в C++

Все привет, есть проблема
Есть клас в одном файле
class X: public Y
{...
public:
...
bool wartime() const {return timing;};
...
protected:
bool timing;
...
};

в другом файле надо такую проверку
if (wartime()==true) ....

тольков вот
if (&X::wartime()==true) результата не дает
error C2352: X::wartime: недопустимый вызов нестатической функции-члена

че не так делаю О.о
Chaosua вне форума   Ответить с цитированием
Старый 22.05.2010, 21:44   #2
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Сначала надо создать экземпляр класса или же использовать статичяеский метод в классе как-то так
:
Код:
class X: public Y
{...
public:
...
static bool wartime() const {return timing;};
...
protected:
bool timing;
...
};
или экземпляр
Код:
X _x = X();
if (_x::wartime()==true)
__________________

Последний раз редактировалось Konctantin; 22.05.2010 в 21:47.
Konctantin вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Chaosua (22.05.2010)
Старый 22.05.2010, 21:48   #3
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

if (wartime()) можно писать внутри методов класса X и любого его потомка.
== true не нужно.
zergtmn вне форума   Ответить с цитированием
Старый 22.05.2010, 22:29   #4
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Konctantin Посмотреть сообщение
Сначала надо создать экземпляр класса или же использовать статичяеский метод в классе как-то так
:
Код:
class X: public Y
{...
public:
...
static bool wartime() const {return timing;};
...
protected:
bool timing;
...
};
или экземпляр
Код:
X _x = X();
if (_x->wartime()==true)
Fix'd
LordJZ вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Chaosua (22.05.2010)
Старый 22.05.2010, 23:20   #5
Chaosua
Новичок
 
Аватар для Chaosua
 
Регистрация: 07.03.2010
Сообщений: 4
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Chaosua На верном пути
По умолчанию

а все таки прошел вариант
Код:
if (_x.wartime()==true)


хотя вроде оно никогда не выдает true спс буду колдовать дальше

Последний раз редактировалось Chaosua; 23.05.2010 в 01:03.
Chaosua вне форума   Ответить с цитированием
Старый 23.05.2010, 08:56   #6
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Если вам надо поймать условие true, достаточно написать
Код:
if (_x->wartime())
а если false, тогда
Код:
if (!_x->wartime())
__________________
Konctantin вне форума   Ответить с цитированием
Старый 14.01.2011, 19:00   #7
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
Код:
X _x = X();
if (_x->wartime()==true)
Fix'd
Ерунду какую-то понаписали...

либо при объявлении экземпляра класса Х _x, использовать оператор "."
Код:
_x.wartime()
либо вместо
Код:
X _x = X();
надо объялять указатель на класс и создавать его
Код:
X* _x = new X();
и тогда использовать оператор "->"

И еще, на кой предмет в объявлении X _x писать = X()
такое объявление пишется просто так X _x;. У конструктора все равно нет параметров.
А если бы были параметры, то так X _x(параметр1, параметр2, ...);

Подытожив все сказанное, правильный вариант выглядит так:
Код:
class X: public Y
{...
public:
...
bool wartime() {return timing;};
...
protected:
bool timing;
...
};

X _x;
if (_x.wartime())
{
   ...
}
И последнее. Если функция объявлена как static, то никаких const не может быть. И не сможет она вернуть значение нестатического члена timing.
А учитывая то как был объявлен класс, функция wartime() возвращает именно переменную член, следовательно никаких статиков.

Последний раз редактировалось Йоха; 14.01.2011 в 19:03.
Йоха вне форума   Ответить с цитированием
Старый 11.04.2011, 11:17   #8
Blacksmither
Kobold Dev
 
Аватар для Blacksmither
 
Регистрация: 29.07.2010
Сообщений: 21
Сказал(а) спасибо: 5
Поблагодарили 2 раз(а) в 2 сообщениях
Blacksmither На верном пути
По умолчанию

Цитата:
Ерунду какую-то понаписали...
Это не ерунда а веяние C# - где все динамические объекты являются ссылками

Цитата:
Подытожив все сказанное, правильный вариант выглядит так:
Или так:

Код:
// x_class.h

class X: public Y
{
public:

    // ...

    static bool wartime() {
        return timing;
    }
    
protected:

    static bool timing;
};

// z_class.h

#include "x_class.h"

class Z
{
public:

    static void simple_method() {
        if ( X::wartime() ) {
            // ...
        }
    }
    
    // ...
};
__________________
World Database Development Group

Последний раз редактировалось Blacksmither; 11.04.2011 в 11:54.
Blacksmither вне форума   Ответить с цитированием
Старый 11.04.2011, 12:57   #9
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

Во-первых тема совершенно не двусмысленно называется "классы в с++", поэтому с# тут совсем не причем. Зачем путать синтаксис двух разных языков ?
Не знаю что означает ключевое слово static в с#, а в плюсах объявление переменной члена или функции члена как статик, делает ее глобальной переменной/функцией в пространстве имен класса. А объявление переменной вне класса делает ее просто глобальной, для фугкции не члена объявление static бессмысленно.
И подобное объявление класса (как в предыдущем посте) является бредом чистой воды.
Эквивалент для класса X можно записать так:

Код:
namespace X
{
	bool timing;
	bool wartime()
	{
		return timing;
	}
};
только какой в этом смысл ?

P.S. любителям с# советую в программах на с++ не лепить кругом static, в плюсах это неактуально и чревато ошибками. Вообще использование конструкций языка без понимания того что они делают чревато багами которые потом ни за что на свете не найти

Последний раз редактировалось Йоха; 11.04.2011 в 13:10.
Йоха вне форума   Ответить с цитированием
Старый 11.04.2011, 13:50   #10
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
любителям с# советую в программах на с++ не лепить кругом static, в плюсах это неактуально и чревато ошибками
в С# - это тоже не лучший стиль
__________________
Konctantin вне форума   Ответить с цитированием
Старый 11.04.2011, 15:04   #11
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Цитата:
для фугкции не члена объявление static бессмысленно.
тогда код функции будет доступен только в compilation unit - внетри объектника обучно создаваемого для каждого .cpp, т.е. будет локальным в .cpp что позволяет компилятору оптимизировать вызовы и т.д.

Вообще в C++ у static 3 совершенно разных значения в
1) описании класса
2) вне класса и функции
3) внутри кода функции.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 11.04.2011, 15:47   #12
Blacksmither
Kobold Dev
 
Аватар для Blacksmither
 
Регистрация: 29.07.2010
Сообщений: 21
Сказал(а) спасибо: 5
Поблагодарили 2 раз(а) в 2 сообщениях
Blacksmither На верном пути
По умолчанию

Цитата:
Не знаю что означает ключевое слово static в с#, а в плюсах.
И там и там - это означает возможность получить доступ к члену/методу до создания самого объекта. (Что касается классов).

Цитата:
И подобное объявление класса (как в предыдущем посте) является бредом чистой воды.
Эквивалент для класса X можно записать так:
А еще можно:

Структурой.
Через Singleton.
...

Это все тоже бред чистой воды? В каждой конкретной ситуации - проще (и зачастую, необходимо) делать так, а не иначе. Или Вы все пишите по шаблону? Скажем, помимо одного "static bool wartime()" там есть еще "void dynamic_func()" - но wartime вызывается часто/необходимо иметь одну и ту-же величину не прибегая к паттернам Одиночки и прочему. Да мало-ли случаев и ситуаций...

Цитата:
для фугкции не члена объявление static бессмысленно.
... смысл в ограничивании области видимости на опр. модуль где этот член был объявлен (даже 'extern' не поможет). Ну это уже сказали

Цитата:
программах на с++ не лепить кругом static, в плюсах это неактуально и чревато ошибками
"Лепить кругом" вообще ничего не надо. Нужно по ситуации. С тем-же успехом можно нарваться на "unresolved external symbol" при "активной глобализации данных". На утечки памяти при юзании обьектов на право и налево. "Докатится" до самопального "сборщика мусора" и прийти к выводу, что С++ очень плохой и крайне сложный язык программирования

Все нужно в меру

Цитата:
Во-первых тема совершенно не двусмысленно называется "классы в с++", поэтому с# тут совсем не причем. Зачем путать синтаксис двух разных языков ?
Ну запутался человек в синтаксисе. Что теперь расстреливать его?
__________________
World Database Development Group
Blacksmither вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 16:53. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot