none
return struct из функции RRS feed

  • Вопрос

  • Что то я туплю, авось вы поможете...
    Если делать так: То это нормально работает.

    struct MyStruct
    {
        int value;
    };
    
    MyStruct ReturnValue()
    {
        MyStruct mystruct;
    
        mystruct.value = 777;
    
        return mystruct;
    }
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        MyStruct test;
    
        test = ReturnValue();
    
             cout << test.value;
    
             getchar();
    
        return 0;
    }
    А если попытаться перенести это в другой класс, то ошибка.

    Test.h

      
     class Test
     {
        public:
        
        Test(void);
        
        virtual ~Test(void);
    
        struct MyStruct
        {
             int value;
        };
    
        Test::MyStruct ReturnValue();
     };
    Test.cpp

    Test::Test(void)
    {
    }
    
    Test::~Test(void)
    {
    }
    
    Test::MyStruct ReturnValue()
    {
        Test::MyStruct mystruct;
    
        mystruct.value = 777;
    
        return mystruct;
    }
    Вызываем:

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
        MyStruct test;
    
        Test mytest;
    
        test = mytest.ReturnValue();
    
        cout << test.value;
    
        getchar();
    }
    И тут выдает ошибку

    error C2679: бинарный '=': не найден оператор, принимающий правый операнд типа 'Test::MyStruct' (или приемлемое преобразование отсутствует)
    1> c:\documents\visual studio 2008\projects\mfc\mfc\mfc.cpp(29): может быть 'MyStruct &MyStruct::operator =(const MyStruct &)'
    1> при попытке сопоставить список аргументов '(MyStruct, Test::MyStruct)'

    you can't kill me. i was born dead
    • Перемещено SachinW 2 октября 2010 г. 0:52 MSDN Forums Consolidation (От:Visual Studio Team System)
    • Перемещено PashaPashModerator 2 ноября 2010 г. 9:52 (От:Работа в среде Visual Studio)
    17 февраля 2010 г. 13:38

Ответы

  • Каша какая-то вышла :)

    1.

    Test::MyStruct ReturnValue()
    {
    }

    Тут содержится ошибка. Ты определяешь функцию ReturnValue, которая не является членом класса Test. IMHO корректное определение будет такое:

    Test::MyStruct Test::ReturnValue()
    {
    }

    2.

    Test mytest;

    test = mytest.ReturnValue();

    ReturnValue возвращает Test::MyStruct, не совсем корректно присваивать это значение объекту типа Test.
    • Помечено в качестве ответа PashaPashModerator 2 ноября 2010 г. 9:51
    17 февраля 2010 г. 21:46