Compreensão -Weffc ++
Considere o seguinte programa:
#include <string>
struct S {
S (){}
private:
void *ptr = nullptr;
std::string str = "";
};
int main(){}
Isto, quando compilado com-Weffc++
no GCC 4.7.1, vai cuspir:
warning: 'struct S' has pointer data members [-Weffc++] warning: but does not override 'S(const S&)' [-Weffc++] warning: or 'operator=(const S&)' [-Weffc++]
Isso não é problema normalmente, exceto por algumas coisas com este exemplo:
Se eu comentar qualquer um dos construtores, a declaração do ponteiro ou a declaração da cadeia, o aviso desaparece. Isso é estranho porque você acha que o ponteiro sozinho seria suficiente, mas não é. Além disso, mudar a declaração de string para uma declaração de inteiro faz com que ela desapareça também, então só aparece quando há uma string (ou provavelmente outras classes de escolha) com ela. Por que o aviso desaparece nessas circunstâncias?
Muitas vezes esse aviso aparece quando o ponteiro está apontando para uma variável existente (geralmente mantida pelo SO). Não hánew
, e nãodelete
. Quando a classe com o identificador, nesses casos, é copiada, não quero uma cópia profunda. Eu quero que ambas as alças apontem para o mesmo objeto interno (como uma janela, por exemplo). Existe alguma maneira de fazer o compilador perceber isso sem sobrecarregar desnecessariamente o construtor de cópias e o operador de atribuição, ou desabilitar o aviso completamente com#pragma
? Por que eu estou sendo incomodado em primeiro lugar quando a Regra de Três não se aplica?