Eu uso C e struct
s onde uma estrutura pode ter membros, mas não funções. Suponha, por simplicidade, que eu quero criar uma estrutura para cadeias que eu nomeie str
e que seja capaz de fazer str.replace(int i, char c)
onde i
é o índice da cadeia e c
o caractere para substituir o caractere na posição i
. Isso nunca seria possível, já que estruturas não podem ter funções ou ainda existe alguma maneira de implementar esse comportamento e imitar que uma estrutura poderia ter uma função (simples) que, na verdade, é apenas a estrutura que está se copiando para uma nova estrutura e atualizando sua estrutura? campos, o que poderia fazer?
Portanto, replace
poderia ser um terceiro membro da estrutura que aponta para uma nova estrutura que é atualizada quando é acessada ou semelhante. Isso poderia ser feito? Ou há algo embutido ou alguma teoria ou paradigma que impeça minha intenção?
O pano de fundo é que estou escrevendo código C e me vejo reinventando funções que eu sei que são bibliotecas embutidas em linguagens OOP e que OOP seria uma boa maneira de manipular seqüências de caracteres e comandos.
fonte
str.replace(&str, i, c)
qualquer maneira. C ++ automatiza a passagem dothis
ponteiro, é claro.Respostas:
Sua função deve ficar assim.
Isso aceita um ponteiro para o objeto para operar como o primeiro parâmetro. Em C ++, isso é conhecido como o
this
-pointer e não precisa ser declarado explicitamente. (Compare isso com o Python, onde for necessário.)Para chamar sua função, você também passaria esse ponteiro explicitamente. Basicamente, você negocia o
o.f(…)
sintaxe pelaf(&o, …)
sintaxe. Não é grande coisa.A história se torna mais envolvida se você deseja apoiar o polimorfismo (também conhecido como
virtual
funções). Também pode ser emulado em C (eu mostrei para esta resposta ), mas não é bonito de fazer manualmente.Como Jan Hudec comentou, você também deve criar o hábito de prefixar o nome da função com o nome do tipo (ou seja
string_replace
), porque C não possui espaços de nome, portanto, pode haver apenas uma única função nomeadareplace
.fonte
string_replace
, porque C não tem função de sobrecarga quer e que são susceptíveis de ter algum outroreplace
por algum outro tipo ...string_replace
. Nomes que começam comstr
,mem
ouwcs
seguido de uma letra minúscula são reservados para futuras ampliações.As estruturas podem conter ponteiros de função , mas esses são realmente necessários apenas para métodos virtuais. Métodos não virtuais em C orientado a objeto geralmente são feitos passando a estrutura como o primeiro argumento para uma função regular. Olhe para a Gobject um bom exemplo de uma estrutura OOP para C. Ele usa macros para lidar com grande parte do padrão necessário para herança e polimorfismo.
C foi criado há 44 anos. É uma linguagem muito popular para código aberto. Você não é a primeira pessoa a pensar que strings C padrão são desajeitadas para trabalhar. Faça algumas pesquisas por bibliotecas de cadeias C. Você não precisa reinventar a roda.
fonte
Com ponteiros de função, você pode fazer:
Geralmente, isso só é útil se a implementação puder mudar; nesse caso, você deve usar uma vtable para que a sobrecarga seja apenas um ponteiro por estrutura:
fonte
str
(oumem
ouwcs
) e uma letra minúscula são reservados pelo padrão C para extensões futuras, portanto, não o chamestring_replace
.str_replace
está bem.Sim, eles podem, mais ou menos. Você pode usar o fato de que C permite que ponteiros funcionem em blocos de memória, também conhecidos como ponteiros de função, e que você pode criar interface como polimorfismo e funções virtuais (mesmo que não seja tão bonita).
Eu escrevi um post sobre esse assunto, seguindo uma pergunta de um dos meus alunos, recentemente, referente ao código de interface em C e Go, você pode lê-lo aqui:
Postagem em blog sobre interfaces não OO
Veja se isso lhe dá alguma idéia.
Você também pode simplesmente colocar uma função livre em seu código e usar um ponteiro "this", o que significa que você passa um ponteiro para uma estrutura existente para trabalhar, conforme descrito em outras respostas.
fonte