Tengo un error al compilar. Use "constructor (...) { ... }" en su lugar

He seguido la conferencia en Udemy. pero tengo un error

aquí está mi 'Bandeja de entrada/contratos/Bandeja de entrada.sol'

pragma solidity ^0.4.17;
contract Inbox {
    string public message;

    function Inbox(string initialMessage) public {
        message = initialMessage;
    }

    function setMessage(string newMessage) public {
        message = newMessage;
    }
}

y aquí hay un archivo 'Inbox/compile.js'

const path = require('path');
const fs = require('fs');
const solc = require('solc');

const inboxPath = path.resolve(__dirname, 'contracts','Inbox.sol');
const source = fs.readFileSync(inboxPath, 'utf8');

console.log(solc.compile(source, 1));

y después compilo este archivo en la terminal

nodo compilar.js

obtuve un error como el siguiente

  errors: 
           [ ':6:5: Warning: Defining constructors as functions with the same name 
as the contract is deprecated. Use "constructor(...) { ... }" 
    instead.\n    function Inbox(string initialMessage) public {\n    ^ 
    (Relevant source part starts here and spans across multiple lines).\n' ],

Yo uso mac. Una cosa que hice de manera diferente a la conferencia fue 'npm init' en otra carpeta en lugar de la Bandeja de entrada y copié y pegué todos los archivos creados en la carpeta de la bandeja de entrada.

la respuesta de mirgi está cerca. Pero alant es correcto, no coloque la palabra clave de función delante de la palabra clave de constructor.
en la versión anterior de la solidez era correcta. Se ha cambiado recientemente y mi publicación se actualizó ahora.

Respuestas (4)

Debería ser una advertencia, no un error. De todos modos usando esta sintaxis

function Inbox(string initialMessage) public {
    message = initialMessage;
}

está obsoleto en la versión más nueva de Solidity. Tienes que usar constructoren lugar del nombre del contrato

constructor(string initialMessage) public {
    message = initialMessage;
}

esto se compilará sin advertencias

Además, si está haciendo esto, asegúrese de cambiar la primera línea a pragma solidity ^0.4.22;, de lo contrario, si alguien intenta compilar su contrato con un compilador antiguo, no funcionará según lo previsto.
Pero si cambia el nombre de la función constructora de ContractName a constructor, entonces, ¿cómo puede implementar este contrato desde otro contrato? Cómo corregir este código después de cambiar el nombre de la función constructora: dirección addr = new theContractName(..); ???
de la misma manera que lo hizo antes, simplemente cree una nueva instancia connew

Solo use constructor() debería ser bueno.

constructor(string initialMessage) public {
    message = initialMessage;
}

Si usa el constructor de funciones (...)... , creo que recibirá la siguiente advertencia:

Advertencia: esta función se llama "constructor" pero no es el constructor del contrato. Si pretende que sea un constructor, use "constructor(...) { ... }" sin la palabra clave "función" para definirlo.

Personalmente, acabo de cambiar el compilador para resolver el problema. En lugar de un compilador v4.17+, use el compilador v4.17. Espero que esto haya ayudado:

No olvide agregar memoryo storagecuando declare parámetros como una cadena en el constructor

 constructor(string memory initialMessage) {
        message = initialMessage;
    }