![](/img/trans.png)
[英]In Solidity, can the constructor function have the same name as the contract?
[英]Solidity 0.5.1, when creating a contract object, why do we have to pass the token to that contract's constructor even if there is no constructor
这是代码:
pragma solidity 0.5.1;
contract ERC20Token{
string public name;
mapping(address => uint256) public balances;
function mint() public{
balances[tx.origin] += 1;
}
}
contract MyContract {
address payable wallet;
address public token;
constructor(address payable _wallet, address _token) public {
wallet = _wallet;
token = _token;
}
function() external payable {
buyToken();
}
function buyToken() public payable{
ERC20Token _token = ERC20Token(address(token));
_token.mint();
wallet.transfer(msg.value);
}
}
过程:
首先,我们首先通过部署 ERC20Token 合约来获取 ERC20Token 合约地址。
其次,MyContract 构造函数将(钱包地址和ERC20Token 合约地址)作为两个参数。
然后,我们从这一行创建一个 ERC20Token 合约 object
ERC20Token _token = ERC20Token(address(token));
我对这条线的工作方式感到困惑。 即使是 ERC20Token 合约也不包含任何构造函数,上面的代码将令牌作为参数传递给 ERC20Token 构造函数。
如果我从上面的代码中删除令牌参数:
ERC20Token _token = ERC20Token();
我会收到一个名为
明确类型转换所需的一个参数
任何人都可以向我解释为什么这种情况会发生吗?
如果没有new
关键字,您将指向一个已部署的ERC20Token
合约实例,并在参数中传递其地址。 由于合约已经部署并且构造函数已经执行,因此您无需传递其构造函数参数。
// address of existing instance
ERC20Token _token = ERC20Token(address(token));
使用new
关键字,您将部署ERC20Token
的新实例,指定其构造函数参数。 然后通过将变量类型转换为address
类型来获得其地址。
// creating new instance
// passing constructor params (in your case empty)
ERC20Token _token = new ERC20Token();
// address of the newly deployed contract
address tokenAddress = address(_token);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.