2014-08-30 6 views
1

여기 아주 간단한 프로그램이 있습니다. 내 목표는 b를 c와 같게 만드는 것, 즉 c의 모든 내용을 b로 복사하는 것입니다. 하지만 어떻게해야할지 모르겠다. getdata() 함수는 객체 배열 c를 가리키는 포인터를 반환하지만 어떻게 c를 b에 넣을 수 있습니까?개체 배열을 전달하는 방법은 무엇입니까?

#include<iostream> 
#include<stdlib.h> 
using namespace std; 
class A 
{ 
    public: 
    A(int i,int j):length(i),high(j){} 
    int length,high; 
}; 

class B 
{ 
    private: 
    A c[3] = {A(9,9),A(9,9),A(9,9)}; 
    public: 
    A* getdata() 
    { 
     return c; 
    } 
}; 

int main() 
{ 
    A b[3]={A(0,0),A(0,0),A(0,0)}; 
    B *x = new B(); 
    cout<< x->getdata() <<endl; 
    cout << b[1].length<<endl; 
    return 0; 
} 
+2

사용'표준 : array' : std::vector (live here on codepad)를 사용하여 코드의 가능한 부분 수정의

#include <vector> // for STL vector .... std::vector<A> v; // define a vector of A's // use vector::push_back() method or .emplace_back() // or brace init syntax to add content in vector... std::vector<A> w = v; // duplicate v's content in w 

. 그것은 자연 복사 개념을 가지고 있습니다. 여기에'new '를 사용할 이유가 없습니다. – chris

+0

@chris Aaannnd 대답입니다; p – Quentin

+0

아무도 참조 나 다른 것을 사용하지 않습니까? – texasbruce

답변

0

대신에, 즉 메인 'B'의 어레이를 생성, A.에 대한 포인터를 생성하고 그 GetData의 호출을 초기화().

A *b; 

B *x = new B(); 

b = x->getdata(); 
+0

감사합니다. 이것은 내가 생각할 수있는 가장 쉬운 방법입니다. –

0

여기 예입니다

#include <iostream> 
#include <algorithm> 

class A 
{ 
public: 
    A(int i, int j) : length(i), high(j){} 
    int length, high; 
}; 

class B 
{ 
private: 
    A c[3] = {A(9,9),A(9,9),A(9,9)}; 
public: 
    A* getdata() 
    { 
     return c; 
    } 
}; 

int main() 
{ 
    A b[3] = { A(0,0), A(0,0), A(0,0) }; 

    B *x = new B(); 
    A *c = x->getdata(); 

    std::copy(c, c + 3, b); 


    for (const A &a : b) std::cout << a.length << '\t' << a.high << std::endl; 

    delete []x; 

    return 0; 
} 

출력은

9 9 
9 9 
9 9 

대신 표준 알고리즘 std::copy의 당신이 일반 루프를 사용할 수 있습니다. 현대 C에서 예를

for (size_t i = 0; i < 3; i++) b[i] = c[i]; 
+0

감사합니다. 당신은 모두 내 것보다 더 나은 해결책을 제공합니다! –

1

를 들어 ++, 자신에게 부탁을하고 (대신 원시 C와 같은 배열을 사용하는) STL std::vector처럼, 당신의 배열을 저장하는 편리한 컨테이너 클래스를 사용합니다.

std::vectoroperator=()의 오버로드를 정의합니다. 따라서 b=c; 구문을 사용하여 소스 벡터를 대상 벡터에 복사 할 수 있습니다.

#include <iostream> 
#include <vector> 
using namespace std; 

class A 
{ 
public: 
    A(int l, int h) : length(l), high(h) {} 
    int length, high; 
}; 

class B 
{ 
private: 
    vector<A> c; 

public: 
    const vector<A>& getData() const 
    { 
     return c; 
    } 

    void setData(const vector<A>& sourceData) 
    { 
     c = sourceData; 
    } 
}; 

int main() 
{ 
    vector<A> data; 
    for (int i = 0; i < 3; ++i) // fill with some test data... 
     data.push_back(A(i,i)); 

    B b; 
    b.setData(data); 

    const vector<A>& x = b.getData(); 
    for (size_t i = 0; i < x.size(); ++i) // feel free to use range-for with C++11 compilers 
     cout << "A(" << x[i].length << ", " << x[i].high << ")\n"; 
} 
+0

감사합니다! 저는 C++의 초보자입니다. 나는 이것을 장래의 상황에서 사용하려고 노력할 것입니다. –

+0

@EbrahimChu : 천만에요. 우리 모두가 한때 "C++의 초보자"였음을 잊지 마십시오.) –

관련 문제