2014-06-06 2 views
-4

나는 생성자를 통해 배열을 초기화하는 방법을 모른다. 나는 모든 0 값으로 배열을 초기화하는 방법 중 하나는하지만, 난 당신이 내 코드에서 볼 수있는 규칙을 따라야합니다 마십시오 여기 How to initialize all elements in an array to the same number in C++ 의 하나라는 것을 알고있다. 나는 setArr()getArr 생성자로() aswell이 필요합니다. arr [5]i처럼 올바르게 작동 할 수 있도록 생성자와 그 함수에 대해 무엇을 넣을 지 말해 줄 수 있습니까? 배열에 대한 생성자에서 초기화와 같은 예제를 찾지 못했기 때문에 귀하의 설명에 진심으로 감사드립니다. 나는 다른 사람들이 나중에 혜택을 누릴 수 있다는까지 그렇게 작동시에 코드를 업데이트합니다 : 는 관련C++의 생성자에서 배열 초기화

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 
class A 
{ 
private: 
    double arr[5]; 
    int i; 
public: 
    //THIS HERE IS WRONG, BUT HOW TO PROGRAMM IT SO THAT I GET NO ERRORS? 
    A(double arrx = {0}, int ix = 4):, i(ix) 
    { 
     std::vector<double> v1(arrx, arrx+5); 
     std::fill(v1.begin(arr), v1.end(arr), arrx); 
    } 
    ~A() {} 
    void setI(int ix) { i = ix; } 
    double getI(void) { return i; } 
    void setArr(double arrx[]) 
    { 
     for (int i=0; i < sizeof(arrx); i++) 
      arr[i] = arrx[i]; 
    } 
    double* getArr(void) { return arr; } 
}; 

int main() 
{ 
    A ob1(6); 
    //ob1.setI(5); 
    std::cout << ob1.getI() << std::endl; 
} 

편집을 주셔서 감사합니다. 오류 C2661을 수정하고 오류가 발생했습니다. 'std :: vector < _Ty> :: begin': 오버로드 된 함수가 1 개의 인수를 사용하지 않습니다.

+1

올바른 C++ 구문을 사용하여 코드를 수정하십시오. – 101010

+0

[여기 도시]은 '0'으로 알 어레이 요소를 초기화하는 방법 관용적 (http://stackoverflow.com/questions/23987515/zero-initializing-an-array-data-member-in-a-constructor/23987926 # 23987926). – juanchopanza

+0

@juanchopanza 생성자는 'arrx'매개 변수가 무엇이든간에 모든 요소를 ​​초기화하려고 시도하는 것 같습니다.이 매개 변수가 단일 값으로 5 회 사용되도록 제한되는지, 그리고/또는 가능한지 여부가 명확하지 않습니다. 실제 5 값 배열을 받아 들일 수 있습니다 - 그러나 그것들 중 원하는 것이 있다면, 당신의 링크에서 다루는 무조건적인 초기화를 0으로 보이기를 원하지 않는 것 같습니다 ... –

답변

2

우선 클래스 디자인에 아무런 의미가 없습니다. :) 그럼에도 불구하고 적어도 세 번째 (또는 네 번째) 생성자가 필요합니다. 기본 생성자, 초기화 프로그램 목록이있는 생성자 및 두 개의 매개 변수가있는 생성자. 예를 들어

#include <iostream> 
#include <initializer_list> 
#include <algorithm> 
#include <iterator> 
#include <stdexcept> 

class A 
{ 
private: 
    static const size_t MAX_SIZE = 5; 
    double arr[MAX_SIZE]; 
    size_t i; 
public: 
    A() : arr{}, i(MAX_SIZE) {} 

    A(size_t n, double x = 0.0) : arr{}, i(n < MAX_SIZE ? n : MAX_SIZE) 
    { 
     std::fill(arr, arr + i, x); 
    } 

    A(double a[], size_t n) 
     : arr{}, i(n < MAX_SIZE ? n : MAX_SIZE) 
    { 
     std::copy(a, a + i, arr); 
    } 

    A(std::initializer_list<double> l) 
     : arr{}, i(l.size() < MAX_SIZE ? l.size() : MAX_SIZE) 
    { 
     std::copy(l.begin(), std::next(l.begin(), i), arr); 
    } 

    void SetValue(double value, size_t n) 
    { 
     if (n < i) arr[n] = value; 
    } 

    double GetValue(size_t n) const throw(std::out_of_range) 
    { 
     if (i <= n) throw std::out_of_range("A::GetValue"); 
     return (arr[n]); 
    } 

    size_t GetI() const 
    { 
     return i; 
    } 
}; 

int main() 
{ 
    A a = { 1.0, 2.0, 3.0, 4.0, 5.0 }; 

    for (size_t i = 0; i < a.GetI(); i++) std::cout << a.GetValue(i) << ' '; 
    std::cout << std::endl; 

    try 
    { 
     a.GetValue(5); 
    } 
    catch(const std::out_of_range &e) 
    { 
     std::cout << e.what() << std::endl; 
    } 

    return 0; 
} 

출력은

1 2 3 4 5 
A::GetValue 

편집은 다음과 같습니다 컴파일러는 다음 대신 두 개의 생성자

A() : arr{}, i(MAX_SIZE) {} 

    A(size_t n, double x = 0.0) : arr{}, i(n < MAX_SIZE ? n : MAX_SIZE) 
    { 
     std::fill(arr, arr + i, x); 
    } 

중 하나를 정의 할 수 있습니다 초기화 목록의 ctor 초기화를 지원하지 않는 경우 건설자. 예를 들어

A(size_t n = MAX_SIZE, double x = 0.0) : i(n < MAX_SIZE ? n : MAX_SIZE) 
{ 
    std::fill(arr, arr + i, x); 
} 
+0

Spasiba! 마침내 누군가 내 문제가 생겼다. 내가 찾고있는 것은 지금 왜 나를 위해 작동하지 않는 이유이다 : * A() : arr {}, i (MAX_SIZE) {} * – beginh

+0

@beginh 컴파일러가 지원하지 않을 가능성이있다. 초기화 프로그램 목록으로 ctor 초기화. –

+0

하지만, 단순한 변수뿐만 아니라 배열과 같은 접근법을 사용하려고 할 때 그렇습니다. 그래서 나는 모든 시간 내게 오지 않는 클래스의 주어진 컨벤션에서 배열을 초기화하는 방법을 궁금해합니다. 왜 그것이 의미가 없다고 생각합니까? – beginh