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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jr_
48 / 48 / 13
Регистрация: 14.06.2016
Сообщений: 195
Завершенные тесты: 3
#1

Игнорировать С2039 - C++

29.09.2016, 15:27. Просмотров 180. Ответов 11
Метки нет (Все метки)

Добрый день.
Не очень обычный вопрос.
Дано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//вот с этим я хочу работать
class SomeClass {
public:
    int a;
    int b;
    int c;
};
 
class SomeClass1_0 {
public:
    int a;
    int b;
};
 
class SomeClass1_1 {
public:
    int a;
    int c;
};
 
template <typename SomeClassType>
SomeClass Get(void *mem) {
    SomeClass result;
    auto aObject = (SomeClassType *)mem;
    result.a = aObject->a;
    result.b = aObject->b; //а вот это я хочу игнорировать в случае чего, если нет этого поля - то и чёрт с ним.
    result.c = aObject->c; //и это
    return result;
}
 
int main( int /*argc*/, char* /*argv*/[] )
{
 
    float version = 1.0f;
    void *mem = nullptr;
    SomeClass someInstance;
    if (version == 1.0f) {
        someInstance = Get<SomeClass1_0>(mem);
    }
 
    if (version == 1.1f) {
        someInstance = Get<SomeClass1_1>(mem);
    }
 
 
    system("pause");
    
    return 0;
}
Естественно, такая бяка не скомпилируется, потому что в процессе компиляции выяснится, что у SomeClass1_0 нет поля "c", а у SomeClass1_1 нет поля "b".
Как то можно игнорировать при компиляции строки, в которых этот самый undeclared identifier?

з.ы. множить функцию Get под все классы не предлагать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2016, 15:27     Игнорировать С2039
Посмотрите здесь:

Ошибки С2868,С2039 и т.д. в xutility - C++
#include &lt;conio.h&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;iostream&gt; struct mystruct { int...

Ошибки С2660 , С2039 в файле xstring - что делать? - C++
Пробовал по частях удалять, но все одно я не могу понять где ошибка в коде. Ведь все вроде работает, и как будто само сорвалось. файл...

Не игнорировать пробелы - C++
Суть вопроса в следующем. Хочу при помощи следующего кода записать содержимое текстового файла в массив. Можно и не в массив, в любой...

Палиндром: игнорировать пробелы - C++
Наличие палиндром в строке от i-го до j-го символа. Как игнорировать пробелы? К примеру если ввести &quot;арбуз у зубра&quot; программа определяет...

Игнорировать ввод букв - C++
Скажите, как игнорировать ввод букв и вообще всех символов кроме 0-9 и точки, подобно проверке на корректность ввода данных. Какой-то цикл...

STL. Алгоритм find(). Игнорировать регистр - C++
Вся суть вопроса изложена в теме. Есть код, я помещаю в очередь с двусторонним доступом 9 слов, далее использую алгоритм find чтобы найти...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5273 / 4593 / 1538
Регистрация: 14.04.2014
Сообщений: 18,243
29.09.2016, 16:12     Игнорировать С2039 #2
Поставь условие с проверкой типа mem.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,184
Завершенные тесты: 1
29.09.2016, 16:32     Игнорировать С2039 #3
Вы не разобрались с концепцией ООП.
Такие операции обязаны выполнять конструкторы и operator=
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <string>
using namespace std;
 
 
class SomeClass1_0 {
    int a;
    int b;
public:
    SomeClass1_0(SomeClass1_0& s)
    {
        a=s.a;b=s.b;
    }
    SomeClass1_0(int a0=0,int b0=0)
    {
        a=a0;b=b0;
    }
    friend class SomeClass;
};
 
class SomeClass1_1 {
    int a;
    int c;
public:
    SomeClass1_1(SomeClass1_1& s)
    {
        a=s.a;c=s.c;
    }
    SomeClass1_1(int a0=0,int c0=0)
    {
        a=a0;c=c0;
    }
    friend class SomeClass;
};
class SomeClass {
    int a;
    int b;
    int c;
public:
    SomeClass& operator=(SomeClass& s)
    {
        a=s.a;b=s.b;c=s.c;
        return *this;
    }
    SomeClass& operator=(SomeClass1_0& s)
    {
        a=s.a;b=s.b;c=0;
        return *this;
    }
    SomeClass& operator=(SomeClass1_1& s)
    {
        a=s.a;b=0;c=s.c;
        return *this;
    }
    SomeClass(SomeClass1_1& s)
    {
        a=s.a;b=0;c=s.c;
    }
    SomeClass(SomeClass& s)
    {
        a=s.a;b=s.b;c=s.c;
    }
    SomeClass(SomeClass1_0& s)
    {
        a=s.a;b=s.b;c=0;
    }
    SomeClass(int a0,int b0,int c0)
    {
        a=a0;b=b0;c=c0;
    }
    SomeClass()
    {
        a=0;b=0;c=0;
    }
}; 
 
int main()
{
    SomeClass ss1(1,2,3);
    SomeClass1_0 ss1_0(4,5);
    SomeClass1_1 ss1_1(6,7);
    SomeClass ss2(ss1_0);
    SomeClass ss3(ss1_1);
    ss1=ss2;
    ss1=ss1_0;
    ss1=ss1_1;
    return 0;
}
jr_
48 / 48 / 13
Регистрация: 14.06.2016
Сообщений: 195
Завершенные тесты: 3
29.09.2016, 17:32  [ТС]     Игнорировать С2039 #4
Цитата Сообщение от zss Посмотреть сообщение
Вы не разобрались с концепцией ООП.
Такие операции обязаны выполнять конструкторы и operator=
Вопрос не в концепции ООП, в процессе рефакторинга было принято решение от него отказаться.
Я ведь написал, что вопрос весьма специфичный.

Цитата Сообщение от nmcf Посмотреть сообщение
Поставь условие с проверкой типа mem.
Постоянно лазить в реализацию метода и городить там макароны из проверок я хочу в последнюю очередь, поэтому такой вариант не рассматривается.
nmcf
5273 / 4593 / 1538
Регистрация: 14.04.2014
Сообщений: 18,243
29.09.2016, 17:39     Игнорировать С2039 #5
Ты ничего не хочешь изменять, всё уже решено. Тогда тему зачем создал?
jr_
48 / 48 / 13
Регистрация: 14.06.2016
Сообщений: 195
Завершенные тесты: 3
29.09.2016, 17:40  [ТС]     Игнорировать С2039 #6
Цитата Сообщение от nmcf Посмотреть сообщение
Ты ничего не хочешь изменять, всё уже решено. Тогда тему зачем создал?
В сабже вроде написано, если мне не изменяет память.
nmcf
5273 / 4593 / 1538
Регистрация: 14.04.2014
Сообщений: 18,243
29.09.2016, 17:42     Игнорировать С2039 #7
Как ты представляешь компиляцию программы с неопределёнными идентификаторами?
castaway
29.09.2016, 18:01
  #8

Не по теме:

nmcf, zss, из первого поста было понятно что он хочет то, сам не зная чего. Не тратьте время.

GbaLog-
Любитель чаепитий
2620 / 1159 / 284
Регистрация: 24.08.2014
Сообщений: 4,226
Записей в блоге: 1
Завершенные тесты: 2
29.09.2016, 18:07     Игнорировать С2039 #9
Вот так можно!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//вот с этим я хочу работать
class SomeClass {
public:
    int a;
    int b;
    int c;
};
 
class SomeClass1_0 {
public:
    int a;
    int b;
    int c;
};
 
class SomeClass1_1 {
public:
    int a;
    int b;
    int c;
};
 
template <typename SomeClassType>
SomeClass Get(void *mem) {
    SomeClass result;
    auto aObject = (SomeClassType *)mem;
    result.a = aObject->a;
    result.b = aObject->b; //а вот это я хочу игнорировать в случае чего, если нет этого поля - то и чёрт с ним.
    result.c = aObject->c; //и это
    return result;
}
 
int main( int /*argc*/, char* /*argv*/[] )
{
 
    float version = 1.0f;
    void *mem = nullptr;
    SomeClass someInstance;
    if (version == 1.0f) {
        someInstance = Get<SomeClass1_0>(mem);
    }
 
    if (version == 1.1f) {
        someInstance = Get<SomeClass1_1>(mem);
    }
 
 
    //system("pause");
    
    return 0;
}
jr_
48 / 48 / 13
Регистрация: 14.06.2016
Сообщений: 195
Завершенные тесты: 3
29.09.2016, 20:39  [ТС]     Игнорировать С2039 #10
Цитата Сообщение от nmcf Посмотреть сообщение
Как ты представляешь компиляцию программы с неопределёнными идентификаторами?
Препроцессор просто игнорирует эту строку как, к примеру игнорировал бы #if ().
В данной теории не очень силен.

Не по теме:

Немного конкретизирую.
Инъекчу свой код в некое приложение. Приложение оперирует набором сущностей (нужных мне около двадцати). Планируемых версий приложения достаточно много, каждая отличается структурой этой самой сущности. К примеру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Item1_0{
private:
  char pad_0x0000[4];
public:
  int Id;
  int Count;
};
 
class Item2_0{
private:
  char pad_0x0000[4];
public:
  int Id;
  __int64 Count;
private:
  char pad_0x0012[4];
public:
  int Position;
};
Но в целом, набор полей одинаков, отличается смещениями и у более поздних версий есть не сильно значительные дополнительные поля.

Сущностей около 20 на данных момент, планируемых поддерживаемых версий - не меньше пяти.
Структура сущностей восстанавливается программой ReClass, она же умеет генерировать c++ определения(как в примере выше).

На данный момент, добавление новой версии класса выглядит как генерация определения реклассом, добавление его в проект и добавление куска в метод-сборщик данных:
C++
1
2
3
if (version == ...){
  item = getItem<Item_Version>();
}
Что гораздо компактнее и легче поддерживать (на мой взгляд офк), нежели поддерживать 20*количество_версий=много конструкторов, в которых запутаться как раз-два. Да еще и отлаживать я могу только машинный код.
Если бы можно было так сделать, как я описал выше.


Судя по тому, что меня приняли за больного, понял, что нет.

Добавлено через 2 часа 30 минут
Решение всё таки нашёл. Вдруг кому нибудь пригодится.
C++
1
2
3
4
5
6
7
__if_exists(SomeClassType::b) {
    result.b = aObject->b;
}
 
__if_exists(SomeClassType::c) {
    result.c = aObject->c;
}
nmcf
5273 / 4593 / 1538
Регистрация: 14.04.2014
Сообщений: 18,243
29.09.2016, 20:42     Игнорировать С2039 #11
Что-то нестандартное. Для какого компилятора это?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 20:43     Игнорировать С2039
Еще ссылки по теме:

Как игнорировать ненужные данные из потока? - C++
Формат входной строки должен быть таким: Слово нужное_нам_число Например: windows 2012 Нужно из strStream потока присвоить...

Как красиво игнорировать символы из входного потока? - C++
Здравствуйте! Необходимо игнорировать некие символы до конца строки. Есть два варианта: std::cin.ignore() - однако! Требуется...

Игнорировать ошибки - Delphi
Здравствуйте, можно ли как то игнорировать ошибки которые всплывают в программе?

Игнорировать ошибку - C#
Во время выполнения программы вылетает исключение, при нажатие на кнопку &quot;Продолжить&quot; программа функционирует положительно. Как программно...


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

Или воспользуйтесь поиском по форуму:
jr_
48 / 48 / 13
Регистрация: 14.06.2016
Сообщений: 195
Завершенные тесты: 3
29.09.2016, 20:43  [ТС]     Игнорировать С2039 #12
https://msdn.microsoft.com/en-us/lib...h3(VS.80).aspx
Работает так, как я это себе и представлял.
Yandex
Объявления
29.09.2016, 20:43     Игнорировать С2039
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru