基础的定义必须先于派生合约的定义
definition of base has to precede definition of derived contract
我有两个不同的文件,它们是 Project1.sol 和 Project2.sol
Project2.sol 就像:
import "./Project1.sol";
contract Project2{
address newProject1Address =address(new Project1());
}
Project1.sol 就像:
import "./Project2.sol";
contract Project1 is Project2{
}
我已经在 Project2.sol 文件中部署了 Project1。而且我一直在使用 Project1.sol 文件中 Project2 中的结构。
我得到一个错误,即“基础的定义必须先于派生合同的定义。”对于这一行:contract Project1 is Project2{
网上查错后,有两份合同一份文件的解决办法。但是,我有两个文件。
我将这两个合同合并到一个文件中。
这是我做的:
pragma solidity >=0.7.0 <0.9.0;
contract Project2{
Apple[] public applepies;
struct Apple{
string name;
mapping (address => bool) applepie;
}
function createProject() external{
address newProject1Address =address(new Project1(msg.sender));
uint idx = applepies.length;
applepies.push();
Apple storage newProject = applepies[idx];
}
}
contract Project1 is Project2{
address public creator;
constructor (address creator1){
creator= creator1;
}
function getDetails(uint index) public{
Apple storage newv= applepies[index];
//require(newv.applepie = msg.sender);
}
}
然后,我无法从 Project2 部署 Project1。当我这样做时,这是我得到的错误,“合同创建的循环引用(无法创建派生或相同合同的实例)”在这部分 address newProject1Address =address(new Project1());
我该怎么办?你有什么建议?
您正在另一个继承被调用方的合约中实例化一个合约。有点循环引用。
当您从基础合同(项目 2)继承合同(项目 1)时,继承方(项目 1)应该是进行调用的合同。您的 (Project2) 合同就像一个基础合同。如果需要,继承合约 (Project1) 可以调用或覆盖基础合约中的所有函数。所以这里是我的建议(这是解决您问题的众多方法之一)。见下文。我编译并部署了它,它可以工作。部署时不要忘记提供地址。我希望这会有所帮助。如果您有其他问题,请联系我。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;
contract Project2{
struct Apple{
string name;
bool applepie;
//mapping (address => bool) applepie;
}
Apple[] public applepies;
Apple public newProject;
constructor() {
//address newProject1Address = address(new Project1(msg.sender));
//uint idx = applepies.length;
newProject = Apple("superApple", true);
applepies.push(newProject);
}
function getNewProject() public view returns(string memory){
return newProject.name;
}
}
contract Project1 is Project2{
address public creator;
constructor (address creator1){
creator= creator1;
}
function getDetails(uint index) public view returns (string memory){
Apple storage newv= applepies[index];
//require(newv.applepie = msg.sender);
return newv.name;
}
}
我有两个不同的文件,它们是 Project1.sol 和 Project2.sol
Project2.sol 就像:
import "./Project1.sol";
contract Project2{
address newProject1Address =address(new Project1());
}
Project1.sol 就像:
import "./Project2.sol";
contract Project1 is Project2{
}
我已经在 Project2.sol 文件中部署了 Project1。而且我一直在使用 Project1.sol 文件中 Project2 中的结构。
我得到一个错误,即“基础的定义必须先于派生合同的定义。”对于这一行:contract Project1 is Project2{
网上查错后,有两份合同一份文件的解决办法。但是,我有两个文件。
我将这两个合同合并到一个文件中。
这是我做的:
pragma solidity >=0.7.0 <0.9.0;
contract Project2{
Apple[] public applepies;
struct Apple{
string name;
mapping (address => bool) applepie;
}
function createProject() external{
address newProject1Address =address(new Project1(msg.sender));
uint idx = applepies.length;
applepies.push();
Apple storage newProject = applepies[idx];
}
}
contract Project1 is Project2{
address public creator;
constructor (address creator1){
creator= creator1;
}
function getDetails(uint index) public{
Apple storage newv= applepies[index];
//require(newv.applepie = msg.sender);
}
}
然后,我无法从 Project2 部署 Project1。当我这样做时,这是我得到的错误,“合同创建的循环引用(无法创建派生或相同合同的实例)”在这部分 address newProject1Address =address(new Project1());
我该怎么办?你有什么建议?
您正在另一个继承被调用方的合约中实例化一个合约。有点循环引用。
当您从基础合同(项目 2)继承合同(项目 1)时,继承方(项目 1)应该是进行调用的合同。您的 (Project2) 合同就像一个基础合同。如果需要,继承合约 (Project1) 可以调用或覆盖基础合约中的所有函数。所以这里是我的建议(这是解决您问题的众多方法之一)。见下文。我编译并部署了它,它可以工作。部署时不要忘记提供地址。我希望这会有所帮助。如果您有其他问题,请联系我。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;
contract Project2{
struct Apple{
string name;
bool applepie;
//mapping (address => bool) applepie;
}
Apple[] public applepies;
Apple public newProject;
constructor() {
//address newProject1Address = address(new Project1(msg.sender));
//uint idx = applepies.length;
newProject = Apple("superApple", true);
applepies.push(newProject);
}
function getNewProject() public view returns(string memory){
return newProject.name;
}
}
contract Project1 is Project2{
address public creator;
constructor (address creator1){
creator= creator1;
}
function getDetails(uint index) public view returns (string memory){
Apple storage newv= applepies[index];
//require(newv.applepie = msg.sender);
return newv.name;
}
}