【发布时间】:2021-05-04 13:02:46
【问题描述】:
我有两个不同的文件,分别是 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 中的结构。
我收到一个错误,即“base 的定义必须先于派生合约的定义。”对于这一行: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());
我该怎么办?你有什么建议?
【问题讨论】:
-
你能澄清一下“我在 Project2.sol 文件中部署了 Project1”是什么意思吗? ...这没有多大意义:1)合约被部署到网络,而不是文件。 2) 错误消息和“Project2.sol 中的 Project1”表明您在一个文件中定义了两个合约,但您的代码示例明确定义了两个文件 -“Project1.sol”和“Project2.sol”。
-
@PetrHejda 1)我修复了我在帖子上想说的部分 2)并添加了你说的部分。你能再检查一遍吗?我希望现在更清楚。对不起我的英语。
-
还有几件事:1)您使用的是什么版本的 Solidity? 2)
function createProject{抛出语法错误。它在某些非常旧的版本中有效,或者您没有正确复制粘贴括号(旧 Solidity 版本)和可见性修饰符(public,external,...)。你也能纠正这个吗?
标签: inheritance ethereum solidity smartcontracts contract