2015-10-21 2 views
0

Объекты (которые не являются динамическими) представляют собой блоки данных в памяти.C++ Цикл по адресам объекта

Есть ли способ циклического перехода и печати каждого элемента в объекте?

Я пробовал делать это с помощью «этого», но я все время получаю ошибки.

#include "stdafx.h" 
#include <iostream> 
#include "TestProject.h" 

using namespace std; 


class myclass { 

    int someint = 10; 
    double somedouble = 80000; 
    int somearray[5] = {0, 1, 2, 3, 4}; 


public: 
    void somefunction(); 


}; 


void myclass::somefunction() { 


    cout << "\n test \n" << this; 

    myclass *somepointer; 

    somepointer = this; 

    somepointer += 1; 

    cout << "\n test2 \n" << *somepointer; 
    //Error: no opperator '<<' matches these operands 

} 



int main() { 


    myclass myobject; 

    myobject.somefunction(); 

    return 0; 
} 

Я предполагаю, что ошибка связана с тем, что типы не совпадают. Но я не могу понять решение. Есть ли динамический тип, или мне нужно каким-то образом проверить тип?

+0

Если ваш класс не сделан целиком из указателей, маловероятно, что повторение через память на 1 приведет вас к следующему объекту. – mjr

+0

Также ... причина, по которой вы получаете «Ошибка: никакой операнд << << соответствует этим операндам», потому что у вас нет оператора <<, определенного для myclass. Я собираюсь предположить, что это ошибка времени компиляции? Если вы сделаете это для компиляции, вы будете испытывать недостаток или хуже, когда вы разыгрываете какой-то показатель. – mjr

+1

На самом деле указатели больше, чем 'char', поэтому он даже не работал бы с указателями. У вас должны быть только такие, как 'char' – jaggedSpire

ответ

1

Вы должны добавить друга глобальный std::ostream operator << для отображения содержимого объекта

#include "stdafx.h" 
#include <iostream> 

using namespace std; 


class myclass { 
    int someint; 
    double somedouble; 
    int somearray[5]; 
public: 
    myclass() 
    { 
     someint = 10; 
     somedouble = 80000; 
     somearray[0] = 0; 
     somearray[1] = 1; 
     somearray[2] = 2; 
     somearray[3] = 3; 
     somearray[4] = 4; 
    } 
    void somefunction(); 
    friend std::ostream& operator << (std::ostream& lhs, const myclass& rhs); 
}; 


std::ostream& operator << (std::ostream& lhs, const myclass& rhs) 
{ 
    lhs << "someint: " << rhs.someint << std::endl 
     << "somedouble: " << rhs.somedouble << std::endl 
     << "somearray: { "; 

    for (int iIndex = 0; iIndex < 5; iIndex++) 
    { 
     if (iIndex == 4) 
      lhs << rhs.somearray[iIndex] << " }" << std::endl; 
     else 
      lhs << rhs.somearray[iIndex] << ", "; 
    } 

    return lhs; 
} 


void myclass::somefunction() { 


    cout << "\n test \n" << this; 

    myclass *somepointer; 

    somepointer = this; 

    somepointer += 1; // wrong pointer to object with `object + sizeof(object)` address, 
    // data probably has been corrupted 

    cout << "\n test2 \n" << *somepointer; // displaying objects content 
} 

int main() { 


    myclass myobject; 

    myobject.somefunction(); 

    return 0; 
} 

, как вы хотите, чтобы добраться до элемента объекта, используя свои указатели смены я отправляю другую программу

#include "stdafx.h" 
#include <iostream> 

using namespace std; 


#pragma pack (push, 1) // force data alignment to 1 byte 

class myclass { 
    int someint; 
    double somedouble; 
    int somearray[5]; 
public: 
    myclass() 
    { 
     someint = 10; 
     somedouble = 80000; 
     somearray[0] = 0; 
     somearray[1] = 1; 
     somearray[2] = 2; 
     somearray[3] = 3; 
     somearray[4] = 4; 
    } 
    void somefunction(); 
    friend std::ostream& operator << (std::ostream& lhs, const myclass& rhs); 
}; 

#pragma pack (pop) // restore data alignment 


std::ostream& operator << (std::ostream& lhs, const myclass& rhs) 
{ 
    lhs << "someint: " << rhs.someint << std::endl 
     << "somedouble: " << rhs.somedouble << std::endl 
     << "somearray: { "; 

    for (int iIndex = 0; iIndex < 5; iIndex++) 
    { 
     if (iIndex == 4) 
      lhs << rhs.somearray[iIndex] << " }" << std::endl; 
     else 
      lhs << rhs.somearray[iIndex] << ", "; 
    } 

    return lhs; 
} 


void myclass::somefunction() { 

    int* pSomeInt = (int*)this; // get someint address 
    double *pSomeDouble = (double*)(pSomeInt + 1); // get somedouble address 
    int* pSomeArray = (int*)(pSomeDouble + 1); // get somearray address 

    std::cout << "someint: " << *pSomeInt << std::endl 
     << "somedouble: " << *pSomeDouble << std::endl 
     << "somearray: { "; 

    for (int iIndex = 0; iIndex < 5; iIndex++) 
    { 
     if (iIndex == 4) 
      std::cout << pSomeArray[iIndex] << " }" << std::endl; 
     else 
      std::cout << pSomeArray[iIndex] << ", "; 
    } 
} 

int main() { 


    myclass myobject; 

    myobject.somefunction(); 

    return 0; 
} 
+0

Итак, вы выбрали членов в переменных для их печати? – bigcodeszzer

+0

Нет другого способа правильной интерпретации данных для вывода. – Mykola

+0

вы также можете использовать указатели void или char, чем использовать фактические сдвиги элементов в байтах для доступа к ним i указатель на someint (int *) pObjPrt, указатель на somedouble (double *) (pObjPrt + 4), указатель на somearray (int *) (pObjPrt + 12) – Mykola

1

C++, дизайн , не имеет функции отражения. Это означает, что во время выполнения нет универсального, независимого от типа способа доступа к метаданным типа (например, список членов, если класс и их типы). То, что вы пытаетесь сделать (если я правильно понимаю), не может быть выполнено на C++.

Также я не уверен, что вы имели в виду под «объектами (которые не являются динамическими)». все объекты являются блоками данных в памяти, независимо от того, динамически они распределены или нет.

+0

I согласитесь, но я уверен, что динамические блоки не гарантируются в порядке. По крайней мере, если они не инициализируются «новым», – bigcodeszzer