함수 전송값 복제 구조 함수 깊이 복사

3857 단어
class A{
	int *m_pi;
public:
	A()
	{
		m_pi = new int;
	}
	~A()
	{
		delete m_pi;
	}
};

void func(A _a)
{
	int a = 0;
}

void main()
{ 
	A a;
	func(a);
}

실행 후 붕괴 원인은func를 호출할 때 임시 대상이 생겨서 구조 함수를 호출하지 않았고 기본 비트 복사를 호출하여 구조 함수를 복제한 다음에 m 를 분석했기 때문이다pi의 메모리, 프로그램이 분석 a를 끝낼 때 붕괴, 해결 방안은 복사 구조 함수를 다시 불러오는 것입니다
class A
{
	int *m_pi;
public:
	A()
	{
		m_pi = new int;
	}
	~A()
	{
		delete m_pi;
	}
	A(A &_a)
	{
		m_pi = new int;
		*m_pi = *_a.m_pi;
	}
};

void func(A _a)
{
	int a = 0;
}

A에 CArray 객체 추가
class A
{
	int *m_pi;
	CArray <int,int &> m_arr;
public:
	A()
	{
		m_pi = new int;
	}
	~A()
	{
		delete m_pi;
	}
	
};

void func(A _a)
{
	int t = 0;
}

주 함수:
    A a;     func(a);
컴파일 오류: "CObject::CObject":private 구성원에 접근할 수 없음 ("CObject"클래스에서 설명함) 이유복사 구조 함수는 정의되지 않았지만, 기본 클래스인 CObject는 정의되었지만,private 권한으로 컴파일 오류가 발생했습니다.private:     CObject(const CObject& objectSrc);             //no implementation     void operator=(const CObject& objectSrc);//no implementation은 대입 연산자에 대해 같은 주 함수 A a를 사용합니다.    A b;     b = a;//A b = a와 다른 첫 번째 오류가 발생했습니다. 컴파일러?오류 보고: "CObject::operator=":private 구성원에 접근할 수 없음(CObject"클래스에서 설명)
솔루션:
재부팅 연산자
    A &operator=(A &)     {         return *this;     }
복제 구조 함수 정의
    A(A &)     {     }
더욱 고려한다
class A
{
	int m_a;
	CArray <int,int> m_arr;
public:
	A(int i){};
};

void main()
{

	A a;
	CArray<A,A &> arr;
	arr.Add(a);
}

오류 보고:
"A"에 사용할 수 있는 기본 구조 함수가 없습니다.
이유:
CArray에 들어가는 유형에 매개 변수 구조 함수가 없어야 하기 때문일 수 있습니다. 매개 변수 구조 함수를 제거합니다
http://hi.baidu.com/idealsoft/item/4de85dcac49b2c2847d5c07d
오류 보고:
"CObject::operator=":private 구성원에 접근할 수 없습니다("CObject"클래스에서 설명)
이유:
arr.Add(a)일 경우 A의=를 호출하고 정의되지 않으면 차례로 구성원을 호출한다.CArray 구성원 marr, Add 함수의 서명은 매개 변수의 종류를 A&로 입력해야 하기 때문에 컴파일러가 문장을 컴파일할 때:arr.Add(a);이 문장을 A&new Element = b로 컴파일할 때 자동으로 a를 A의 인용으로 강제로 변환합니다.arr.Add(newElement); 할당 조작이 이렇게 나타났습니다!해결 방안:정의=조작부호
    A &operator=(A&)     {         return *this;     }
http://blog.csdn.net/vincent_lon/article/details/2950218
또한 CArray 매개 변수를 전송 CArray arr로 변경하면오류:
"CObject::CObject":private 구성원에 접근할 수 없습니다. ("CObject"클래스에서 설명합니다)
add의 매개 변수가 값 전달이 되면 복제 구조 함수 지원이 필요합니다. 우리의 클래스는 없습니다. CArray 역시 없습니다. CObject는 있지만 개인적이기 때문에 컴파일 오류가 발생합니다. 해결 방안은 복사 구조 함수를 정의하는 것입니다.
    A(A &){}     A(){}
무변수 구조 함수를 다시 정의하는 것을 잊지 마라
결론: 당신의 클래스에 캐리 멤버가 있을 때,
1값 형식, 클래스를 위한 무변수 구조 함수, 복사 구조 함수와 = 재부팅 함수.
2 인용 유형, = 조작부호, 무변수 구조 함수
ps : 2014.6.18
"CObject::operator=":private 구성원에 접근할 수 없습니다("CObject"클래스에서 설명)
"CObject::CObject":private 구성원에 접근할 수 없습니다. ("CObject"클래스에서 설명합니다)
CArray는 CObject를 계승하고 CArray는 매개 변수가 없는 기본 구조 함수만 현저하게 정의하며 복사 구조와 값 부여 조작부호 재부팅 함수를 정의하지 않습니다. A는 관련 함수를 정의하지 않은 상황에서 복사 또는 값 부여 조작을 할 때
클래스의 각 구성원 대상의 복사와 값 부여 조작부호 재부팅 함수를 순서대로 호출하고, CArray 대상에 대해서는 복사와 값 부여 조작부호 재부팅 함수를 현시적으로 정의하지 않기 때문에 컴파일러는 자동으로 생성된copy 및 "함수 중 기본 클래스 CObject의 복사 구조와"= "조작부호 함수를 호출하며, 이 두 함수는 CObject에 의해 private 권한으로 성명되어 파생 클래스 CArray에서도 접근할 수 없습니다.
결과:
하나의 기류를 설계할 때
1. 이 클래스가 직접 실례화되는 것을 금지하고 구조 함수를 private or protected로 명시하며 private로 명시될 때 이 클래스와 그 모든 파생 클래스를 실례화할 수 없다. 예를 들어:
class A
{
private:
	A(){}
};

class B : public A
{
public:
	B(){}
};

error C2248: "A: A":private 구성원에 접근할 수 없습니다. ("A"클래스에서 설명합니다)
2. 만약에 안전한 고려에 처해 있으면 파생 클래스가 현식 정의 복제 제어(복제 구조와 값 부여 조작부호 함수)를 강요하면 2개의 복제 제어 함수를private로 명시할 수 있고 보호된 것으로 명시되면 클래스와 파생 클래스 체내에서만 대상 복제 작업을 할 수 있다.

좋은 웹페이지 즐겨찾기