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

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

Восстановить пароль Регистрация
 
jr_
9 / 9 / 2
Регистрация: 14.06.2016
Сообщений: 85
Завершенные тесты: 3
29.09.2016, 15:27     Игнорировать С2039 #1
Добрый день.
Не очень обычный вопрос.
Дано:
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 под все классы не предлагать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
29.09.2016, 16:12     Игнорировать С2039 #2
Поставь условие с проверкой типа mem.
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,202
Завершенные тесты: 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_
9 / 9 / 2
Регистрация: 14.06.2016
Сообщений: 85
Завершенные тесты: 3
29.09.2016, 17:32  [ТС]     Игнорировать С2039 #4
Цитата Сообщение от zss Посмотреть сообщение
Вы не разобрались с концепцией ООП.
Такие операции обязаны выполнять конструкторы и operator=
Вопрос не в концепции ООП, в процессе рефакторинга было принято решение от него отказаться.
Я ведь написал, что вопрос весьма специфичный.

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

Не по теме:

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

GbaLog-
Не Эксперт C++
1526 / 630 / 176
Регистрация: 24.08.2014
Сообщений: 2,545
Записей в блоге: 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_
9 / 9 / 2
Регистрация: 14.06.2016
Сообщений: 85
Завершенные тесты: 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
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
29.09.2016, 20:42     Игнорировать С2039 #11
Что-то нестандартное. Для какого компилятора это?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 20:43     Игнорировать С2039
Еще ссылки по теме:

Как красиво игнорировать символы из входного потока? C++
Ошибки С2868,С2039 и т.д. в xutility C++
C++ Ошибки С2660 , С2039 в файле xstring - что делать?

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

Или воспользуйтесь поиском по форуму:
jr_
9 / 9 / 2
Регистрация: 14.06.2016
Сообщений: 85
Завершенные тесты: 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
Ответ Создать тему
Опции темы

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