본문 바로가기
다양한 TIP

Warning Message 삭제방법(missing-braces, overloaded-virtual)

by 유기농프로그래밍 2024. 9. 2.
반응형

컴파일시 깔끔하지 않게 하는건 뭘까요?

 

바로 Warning Message입니다. 자세히 보면, 버그를 유발할 확률이 높은 것들도 걸러지는데요.

이걸 놔두면 깨진창문효과처럼 점점 코드가 난잡해질 수 있습니다.

 

그럼 어떤 Warning들이 있는지 살펴보고 어떻게 고쳐야할지 알아보겠습니다.

 

warning: suggest braces around initialization of subobject [-Wmissing-braces]

문제

struct in6_addr ip = {0,};

위의 구문은 ipv6를 선언할 때 초기값을 0으로 세팅하려고 하는건데요.

이런 Warning이 뜨게 됩니다.

warning: suggest braces around initialization of subobject [-Wmissing-braces]

 

in6_addr 구조체는 아래와 같은 구조를 가지고 있습니다.

 

struct in6_addr
{
    unsigned char s6_addr[16];
};

 

따라서 초기화할 때 {0,}라고만 하면, s6_addr 배열을 포함하는 구조체의 최상위 수준에서만 중괄호가 제공되므로, 컴파일러는 이 배열의 초기화를 보다 명확하게 하기 위해 중괄호를 더 사용하도록 권장합니다.

 

해결

struct in6_addr ip = {{0}};

 

 

hides overloaded virtual functions [-Woverloaded-virtual]

 C++에서 파생 클래스(derived class)에서 오버로딩(overloading)된 함수가 기초 클래스(base class)의 가상 함수(virtual function)를 숨길 때 발생하는 경고입니다.

 

문제

class Base {
public:
    virtual void func(int x) {
        // 기초 클래스에서 int를 받는 가상 함수
    }

    virtual void func(double x) {
        // 기초 클래스에서 double을 받는 가상 함수
    }
};

class Derived : public Base {
public:
    void func(int x) override {
        // 파생 클래스에서 int를 받는 함수를 오버라이드
    }
};

 

원인

Base 클래스에는 두 개의 func 함수가 있습니다(func(int), func(double))


Derived 클래스에서 func(int)를 오버라이드하려고 시도했습니다.
그러나 Derived 클래스에서 func(int)를 정의하면, func(double) 함수가 숨겨집니다.


파생 클래스에 func(int)를 정의하면, Base 클래스의 func(double) 함수는 더 이상 Derived 클래스에서 접근할 수 없게 됩니다. 이로 인해 hides overloaded virtual functions 경고가 발생합니다.

 

해결

1. using 지시어 사용

Base 클래스의 오버로드된 모든 func 함수들을 Derived 클래스에서 명시적으로 사용할 수 있도록 합니다. using 지시어를 사용하면 Derived 클래스에서 Base 클래스의 모든 오버로드된 함수를 사용할 수 있습니다.

class Derived : public Base {
public:
    using Base::func;  // Base 클래스의 모든 func 함수를 가져옴

    void func(int x) override {
        // int 인자를 받는 함수를 오버라이드
    }
};

 

2. 모든 함수 오버라이드

또 다른 방법은 Base 클래스의 모든 오버로드된 함수를 Derived 클래스에서 오버라이드하는 것입니다. 이렇게 하면 모든 함수가 파생 클래스에서 재정의되므로 숨겨진 함수가 없습니다.

class Derived : public Base {
public:
    void func(int x) override {
        // int 인자를 받는 함수를 오버라이드
    }

    void func(double x) override {
        // double 인자를 받는 함수를 오버라이드
    }
};

이 방법은 모든 버전을 파생 클래스에서 재정의해야 하지만, 이로 인해 숨겨진 함수가 발생하지 않습니다.

 

 

반응형

댓글