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

Problem with passing a list variable by a reference - C++

Восстановить пароль Регистрация
 
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
18.09.2013, 23:06     Problem with passing a list variable by a reference #1
Здравствуйте. Не знал, как нормально сформулировать заглавие на русском! В общем такая проблема. Есть C++ Win32 Empty Project Application. Программа: как всегда улучшаю свою предыдущую версию рендеринга объекта, считываемого из obj файла. На этот раз разделяю программу по отдельным файлам (классам). В главном файле создал переменную типа Vertex (этот тип я реализовал в другом классе (т.е. в другом файле (VertexClass))). Ну и создал List этих Vertex'ов.

Что я хочу сделать? У меня есть метод (опять же в другом, новом классе (ModelClass)), который открывает файл и считывает с него точки (vertex'ы). Так я хочу эти вертексы записать в list, который я пересылаю в этот метод как параметр-ссылка (pass by reference). Но вылезают ошибки, простые, но странные, на мой взгляд. Не могу никак решить. Гуглил: пишут, что порядок include файлов можно неправелен, (но это не по поводу конкретно моего случая). Все переставил двадцать раз, все варианты перепробовал - не помогает. В общем вот код самого главного окна:
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
#include "stdafx.h"
#include "SpinningObjects.h"
#include "ModelClass.h"
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    RECT client;
    GetClientRect(hWnd,&client);
    list<VertexClass> vList, nList; 
    list<FaceClass> vfList, nfList;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE:     
        ModelClass *firstExample;
        firstExample = new ModelClass();
        firstExample->LoadModel(&vList, &nList, &vfList, &nfList);
        
        delete firstExample;
        firstExample = 0;
 
        break;
Вот сам ModelClass: header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef _MODELCLASS_H_
#define _MODELCLASS_H_
 
#include <list>
#include "VertexClass.h"
#include "FaceClass.h"
 
class ModelClass
{
public:
    ModelClass();
    ~ModelClass();
    void LoadModel(list<VertexClass> *vList, list<VertexClass> *nList, list<FaceClass> *vfList, list<FaceClass> *nfList);
 
private: char buffer[50];
    char op;
    char slash;
};
 
#endif
Вот ModelClass cpp:
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
#include "stdafx.h"
#include "ModelClass.h"
#include <iostream>
#include <fstream>
#include <sstream>
 
using namespace std;
 
ModelClass::ModelClass()
{
}
 
ModelClass::~ModelClass()
{
    
}
 
void ModelClass::LoadModel(list<VertexClass> *vList, list<VertexClass> *nList, list<FaceClass> *vfList, list<FaceClass> *nfList)
{
    VertexClass tempVertex, tempNormal;
    FaceClass tempVertexFace, tempNormalFace;
    
    /*list<VertexClass> vList, nList; 
    list<FaceClass> vfList, nfList;*/
 
    ifstream infile("teddy.obj", ifstream::in);
 
    while(!infile.eof())
    {
        infile.getline(buffer, 50);
        istringstream iss(buffer, istringstream::in);
        iss>>op;
        if (op=='v')
        {
            iss>>tempVertex.x>>tempVertex.y>>tempVertex.z;
            vList->push_back(tempVertex);
        }
        else if (op=='f')
        {
            iss>>tempVertexFace.a>>slash>>slash>>tempNormalFace.a>>tempVertexFace.b>>slash>>slash>>tempNormalFace.b>>tempVertexFace.c>>slash>>slash>>tempNormalFace.c;
            vfList->push_back(tempVertexFace);
            nfList->push_back(tempNormalFace);
        }   
        else if (op=='n')
        {
            iss>>tempNormal.x>>tempNormal.y>>tempNormal.z;
            nList->push_back(tempNormal);
        }
    }
    infile.close();
 
    return;
}
Вот Vertex header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef _VERTEXCLASS_H_
#define _VERTEXCLASS_H_
 
class VertexClass
{
public:
    VertexClass();
    ~VertexClass();
 
    float x, y, z;
 
private:
 
};
 
#endif
Вот Vertex cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "VertexClass.h"
 
VertexClass::VertexClass()
{
    
}
 
VertexClass::~VertexClass()
{
}
Face класс аналогичен vertex классу, только там вместо float, int, и вместо x,y,z - a,b,c

Проблема: вылезают 4 ошибки при билде:
Код
Error	1	error C2061: syntax error : identifier 'list'	c:\users\tomas\documents\visual studio 2012\projects\spinningobjects\spinningobjects\modelclass.h	40
Код
Error	3	error C2061: syntax error : identifier 'list'	c:\users\tomas\documents\visual studio 2012\projects\spinningobjects\spinningobjects\modelclass.h	40
Код
Error	4	error C2511: 'void ModelClass::LoadModel(std::list<_Ty> *,std::list<_Ty> *,std::list<FaceClass> *,std::list<FaceClass> *)' : overloaded member function not found in 'ModelClass'	c:\users\tomas\documents\visual studio 2012\projects\spinningobjects\spinningobjects\modelclass.cpp	20
Код
Error	2	error C2660: 'ModelClass::LoadModel' : function does not take 4 arguments	c:\users\tomas\documents\visual studio 2012\projects\spinningobjects\spinningobjects\spinningobjects.cpp	172
Помогите пожалуйста!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.09.2013, 23:12     Problem with passing a list variable by a reference #2
Наверное, нужно (в modelclass.h):
C++
1
std::list
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
18.09.2013, 23:13     Problem with passing a list variable by a reference #3
list он же не просто list, а std::list. Забыли using namespace std; в хедере?
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
19.09.2013, 02:03  [ТС]     Problem with passing a list variable by a reference #4
Нет, лист работает отдельно, без std. Когда я не передаю ссылку а создаю локальную в классе ModelClass, (list) а именно
C++
1
2
/*list<VertexClass> vList, nList; 
    list<FaceClass> vfList, nfList;*/
, то все работает на ура.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 02:18     Problem with passing a list variable by a reference #5
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Нет, лист работает отдельно, без std.
Как он может работать, если такой код нескомпилируется?
Миниатюры
Problem with passing a list variable by a reference  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 02:44     Problem with passing a list variable by a reference #6
Пишет же, нерусским языком, что не нравится, и где:
syntax error : identifier 'list' ...\modelclass.h
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
19.09.2013, 03:05  [ТС]     Problem with passing a list variable by a reference #7
А у меня почему-то нету этих волнистых подчеркиваний... Почему?
Миниатюры
Problem with passing a list variable by a reference  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 03:12     Problem with passing a list variable by a reference #8
Цитата Сообщение от Pro100Tom Посмотреть сообщение
А у меня почему-то нету этих волнистых подчеркиваний... Почему?
Не знаю... Подсказки, при наведении курсора на переменные, появляются?
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
19.09.2013, 03:20  [ТС]     Problem with passing a list variable by a reference #9
Да, но нет ничего об ошибке...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 03:22     Problem with passing a list variable by a reference #10
Особенности 12 студии. Достаточно того, что внизу пишет.
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
19.09.2013, 04:55  [ТС]     Problem with passing a list variable by a reference #11
using namespace std;
(facepalm)

Добавлено через 42 минуты
А как сделать так, чтобы листы не удалялись после того как программа попадает в WM_PAINT
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case WM_CREATE:     
        ModelClass *firstModel;
        firstModel = new ModelClass();
        firstModel->LoadModel(&vList, &nList, &vfList, &nfList);
        
        delete firstModel;
        firstModel = 0;
 
        break;
    case WM_PAINT:
        tempList = vList;
        
        MatrixClass::TransformationMatrix(&tempList);
 
        break;
Когда мы в WM_CREATE, то все значения есть. Когда переходит в другой case, то все листы анулируются...

Добавлено через 34 минуты
Declare
C++
1
2
list<VertexClass> vList, nList, tempList; 
list<FaceClass> vfList, nfList;
before
C++
1
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 12:52     Problem with passing a list variable by a reference #12
Цитата Сообщение от Pro100Tom Посмотреть сообщение
using namespace std;
В заголовочных файлах, крайне не рекомендуется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 13:03     Problem with passing a list variable by a reference
Еще ссылки по теме:

C++ Problem - Undefined reference to
опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing C++
Реализация std::list, сложность list::size() C++

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

Или воспользуйтесь поиском по форуму:
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
19.09.2013, 13:03     Problem with passing a list variable by a reference #13
Pro100Tom, не объявляйте их в wm_create можно объявить сразу после LRESULT CALLBACK, но тогда все переменные надо делать статичными.
Yandex
Объявления
19.09.2013, 13:03     Problem with passing a list variable by a reference
Ответ Создать тему
Опции темы

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