Código fuente completo del archivo 'Test.sol':
pragma solidity ^0.4.23;
contract Mortal{
address owner;
string ownerInfo = "Contract Owner name XYZ";
constructor () public {
owner = msg.sender;
}
function kill () public {
if (msg.sender == owner) {
selfdestruct(owner);
}
}
function ownerInfo() public view returns (string) {
return ownerInfo;
}
}
contract Test is Mortal {
string message = "Hello World!";
constructor () public {
}
function getMessage() public view returns (string){
return message;
}
}
Error del compilador:
myMac:solidity admin$ solc Test.sol
Test.sol:21:2: Error: Identifier already declared.
function ownerInfo() public view returns (string) {
^ (Relevant source part starts here and spans across multiple lines).
Test.sol:9:2: The previous declaration is here:
string ownerInfo = "Contract Owner name XYZ";
^------------------------------------------^
No veo ninguna declaración duplicadaownerInfo
de . ¿Alguna idea, por qué me sale este error?
La respuesta de @Hari GTT Psicolabis es correcta, pero eso significa que debe especificar el ownerInfo
campo public
para obtener el beneficio de un captador público.
string public ownerInfo = "Contract Owner name XYZ";
la alternativa es cambiar el nombre de su función.
Esto se debe a que el método y la propiedad tienen el mismo nombre. Dado que solidity crea automáticamente una función captadora pública para cada variable pública en el contrato, no necesitafunction ownerInfo() public view returns (string)
Hari GTT Psicolabis
RafiAlhamd
string ownerInfo = "x"; function getOwnerInfo() public view returns (string) { return ownerInfo; }
. @hari-gtt-psicolabis, ¡Gracias! Simplemente declarando variable comopublic
también funciona:string public ownerInfo = "x"; function ownerInfo() public view returns (string) { return ownerInfo; }
. Acepté la respuesta de @mirg, ya que exponer el atributo como 'público' no es una solución deseada. Pero, he votado a favor :-)