[08:24] 함수의 주소와 멤버 함수 주소의 차이
강의 중 8분 24초에 아래와 같이 함수포인터를 초기화합니다.
int (Something::*fptr1)() = &Something::temp;
여기서 '&'를 제거하고 Something::temp 초기화하면 non-standard syntax 에러가 발생하는데요.
7.9 장에서 함수 포인터를 배울때는 아래와 같이 함수포인터의 함수의 이름이 포인터이기 때문에 함수의 이름으로 초기화하는데요. 멤버함수의 이름은 멤버 함수의 주소를 나타내지 않나요?
int func() { return 5; }
int main(){
int(*fcnptr)() = func;
return 0;}
choiiohc1
0
7
s_value 초기화하는 부분이 이상한것 같습니다.
s_value는 클래스 내부에서 private로 선언되어 있는데 어떻게 외부에서 접근해서 초기화를 해줄 수 있는 건가요? setValue 등으로 접근이 가능하다고 하면 이해는 하겠는데 헷깔립니다.
pokor2
0
1
11:49 경에
안녕하세요. 강의 잘 듣고 있습니다.
11:49 경에
int (Something:: * fptr1)() = &Something::temp;
cout << (s1.*fptr1)() << endl;
로 펑션 포인터를 선언하고 출력하였는데,
int (*fptr2)() = &Something::getValue;
cout << fptr2() << endl;
에서는 펑션포인터를 출력할때 왜 *를 붙이지 않는지 궁금합니다.
getValue 함수가 static이라 인스턴스에 상관없이 호출할 수 있는것은 알겠는데 temp함수의 펑션 포인터를 출력할때와 getValue함수의 펑션 포인터를 출력할 때에 *의 유무의 차이가 궁금하네요.
mmq mmq
0
5
[16:30] Inner class를 이용하여 정적 멤버 변수를 초기화하는 과정에 대한 질문입니다.
안녕하세요 교수님,
이번 겨울 교수님 덕분에 C++ 공부 즐겁게 하고 있는 학생입니다.
다름이 아니오라 제가 이 코드를 실행하다가 막히는 부분이 있어서 질문드립니다.
우선 실행 환경은
- macOS Catalina
- CLion / Clang
입니다.
VS 위주로 수업이 진행되고, 이외의 플랫폼과 툴에 대해서는 답변이 어려울 수 있다는 말씀을 소개 페이지에 하셨지만 혹여나 제가 놓치고 있는 부분이 있을까 해서 질문 드립니다.
< 수정 >
main 함수 위쪽의
int Something::s_value = 1234; 로 변수의 값을 초기화 해주지 않은 걸 뒤늦게 발견했습니다.
_init 이라는 내부 클래스를 만들고, Something의 멤버 변수(?)로 s_initializer 라는 인스턴스를 생성한 이유가
이 인스턴스가 생성되면서 생성자가 호출 -> 생성자가 s_value를 9876이라는 값으로 초기화
인 것 같습니다만, s_initializer 호출 전에 s_value를 초기화시키지 않으면 아래의 오류가 발생하는 이유가 무엇인가요? (너무 질문이 길어져 죄송합니다...)
#include <iostream>
using namespace std;
class Something
{
public:
class _init // inner class
{
public:
_init() // constructor
{
s_value = 9876;
}
};
private:
static int s_value;
int m_value;
static _init s_initializer;
public:
Something() // constructor
: m_value(123)
{}
// static member function
static int getValue()
{
/*
* in static member function, you CANNOT use 'this pointer'
* since both static member variable & function are independent
* to the instances constructed using the class definition.
*/
return s_value;
}
};
// THIS IS NOT WORKING!!
Something::_init Something::s_initializer;
int main()
{
Something st1;
// cout << st1.getValue() << endl;
/* fptr -> temp
* and the function temp NEEDS 'this' pointer as its input.
*/
/* In contrast,
* static member functions are independent to the instances,
* since it has its own address on memory so we don't need to
* pass the pointer of instance('this') to it.
*/
int (*fptr2)() = &Something::getValue;
cout << (*fptr2)() << endl;
return 0;
}
위에 첨부해드린 코드를 실행시키면 다음과 같은 에러를 볼 수 있습니다.
< 에러 메시지 >
Undefined symbols for architecture x86_64:
"Something::s_value", referenced from:
Something::getValue() in main_8_11.cpp.o
Something::_init::_init() in main_8_11.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)getValue() 라는 정적 멤버 함수에 의해 정적 멤버 변수 s_value가 참조되는 과정에서, 이 변수를 컴파일러가 찾을 수 없다는 내용인 것 같습니다.(제가 생각한 게 맞나요?)
교수님의 강의 코드와 요점 정리를 해주신 분 블로그의 코드까지 참고해서 작성했는데도 오류가 사라지지 않아서 이렇게 질문을 드립니다.
추가적으로 문제 상황을 설명드리는데 있어 도움이 될까 싶어 한 가지 덧붙입니다:
Something::_init Something::s_initializer; (main 함수 위)
에서 s_initializer 아래 노란줄이 표시되는데, 커서를 갖다대면 이런 메시지가 나옵니다.
Clang-Tidy: Initialization of 's_initializer' with static storage duration may throw an exception that cannot be caught
교수님의 친절한 설명 덕분에 처음 배울 때엔 어렵게만 느껴졌던 참조자와 포인터 개념을 잡고 여기까지 올 수 있었습니다. 긴 질문 읽어주셔서 감사드립니다!
DveloperY0115
0
2
[09:18] 펑션포인터 사용하는 부분에서 m_value지우는 게 아니라 s_value를 지워야
[09:18] 펑션포인터 사용하는 부분에서 m_value지우는 게 아니라 s_value를 지워야 더 정확할 꺼 같아요. m_value를 초기화해준 걸 확인하려는 거니까요.
return this->m_value/* + this->s_value*/;
감사합니다.
neue zeal
0
2
C++환경에 대한 기초적인 질문입니다
https://www.inflearn.com/course/following-c-plus/lecture/14743해당 영상 2:50~3:00 구간에서 작성하는 코드에 대해 C++ 프로그래밍 환경과 관련한 기초적인 질문이 있습니다.
클래스 내부에서 선언된 private static 변수를 어떻게 외부(클래스 밖)에서 참조할 수 있는지 궁금합니다.
C#의 경우에서는 해당 코드와 동일하게 작성하여도 참조가 되지 않아 이것이 C++의 어떤 점과 관련이 있나 궁금합니다.
smstudy12
2
3
정적멤버함수 강의 듣다가 궁금한점이 있어 질문드립니다.
#include<iostream>
using namespace std;
class something
{
private:
static int s_value;
int m_value;
public:
static int getvalue()
{
return s_value;
}
int temp()
{
return this->s_value;
}
};
int something::s_value = 1024;
int main()
{
cout << something::getvalue() << endl;
something s1, s2;
cout << s1.getvalue() << endl;
int(something::*fptr1)() = &something::temp;
cout << &fptr1 << endl;
cout << *&fptr1 << endl;
cout << &something::temp << endl;
cout << (s2.*fptr1)() << endl;
}
볼드체 중 cout << &something::temp << endl; 결과 값이 1이 나오는데 &는 주소연산자니 주소가 나와야 하지 않나요?
ekek
0
1
static 멤버 변수를 인스턴스 없이 호출할때
강의 11분에서 설명하시는 질문입니다아래는 제가 따라서 쓴 코드입니다.include using namespace std;class something{private: static int s_value; int m_value;public: static int getValue() { return s_value; } int temp() { return this->s_value; }};int something::s_value = 1024;int main(){ cout << something::getValue()<< endl; something s1,s2; cout << s1.getValue() << endl; int(something::*fptr1)() = &something::temp; cout << (s2.*fptr1)()<<endl; int (*fptr2)() = &something::getValue();막상 빌드를 하려고 하는데Cannot take the address of an rvalue of type 'int'라고 뜹니다..... 우측값의 타입이 'int' 인 주소를 넣지 마세요 라는 말인 것 같은데..어떻게 해결해야 할지 잘 모르겠습니다ㅠㅠ
T Eom
0
2
교수님 질문있습니다!
안녕하세요 지금까지 들어본 강의중에 제일 훌륭하다고 생각해서 열심히 듣고 있는 학생입니다!올해 대학교 3학년으로 전자공학과 재학중이고 부전공으로 컴퓨터 공학을 듣고있습니다. 제 꿈이 게임프로그래머인데 어떻게 시작해야 할지 몰라서 할 수 있는건 최대한 하려고 부전공도 신청하고 학원도 신청해서 열심히 들었습니다만 이렇다 할 결과물이 없어서 지금 하고있는 공부들이 의미가 있나 싶기도 하네요 ㅜㅜ .. 서론이 길었습니다. 두가지 궁금한 점이 있어서 질문드립니다. 첫째는 혹시 컴퓨터 공학과에서 이것만큼은 꼭 들어봐야 한다는 과목들이 있습니까? 현재 컴퓨터 그래픽스(OpenGL)과 다음 학기에 이산수학을 들으려고 생각중입니다. 두번째는 C++ 언어를 완벽히 숙지한다는게 너무 힘듭니다. 새로운 문법들을 공부하고 개인 프로젝트에 써먹으려니 힘들더군요. 배운 것을 어떻게든 써먹으려 하면 프로젝트 진도가 너무 안나가고 그냥 평소에 잘 쓰던 것들로만 짜려니 앞에 배운 문법들이 의미가 없어지는 것 같아서..그리고 안쓰다보니 금방 까먹더군요 .. 어떤식으로 공부를 해야 오래 남을까요 ..? 질문이 많아서 죄송합니다 ㅜㅜ
bbd
0
1
오픈소스공부
교수님이 오프소스 공부하기 전에 기본문법 공부를 하고 보라고 하셨는데 기본 문법 공부가따배씨를 다 끝냈을 때 말한 것 인가요?
이민택
0
1
안녕하세요!
function pointer강의와 클래스에서 function pointer가 햇갈리는 부분이 있어서 질문드립니다
int f(){...}
main(){
int (*fptr)() = f;
}
이전 강의에서는 function 자체가 주소라서 &를 안쓴다고 배웠는데
이번 클래스 강의 에서는 int (Something::*fptr)()=&Something::tmp
&가 왜 들어간지 궁금합니다 ㅠㅠ....
풍자
4
2